顺序表(动态)

来源:互联网 发布:知青子女 知乎 编辑:程序博客网 时间:2024/06/05 07:07

用动态开辟内存的方式写一个列表

SeqList.h

#ifndef _SEQLIST_H__#define _SEQLIST_H__#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>#include <string.h>#include <assert.h>#include <errno.h>#include <stdlib.h>#define TYPES "%d"#define INIT_SZ 2//初始化的容量#define ADD_SZ 2//每次扩容增加的容量typedef int DataType;//为实现各种类型的列表,命名int为DataTypetypedef struct Seqlist {    DataType *List;    int sz;//有效大小    int capacity;//容量}Seqlist, *pSeqlist;void InitSeqlist(pSeqlist p);//初始化void PushBack(pSeqlist p, DataType d);//尾插void PrintSeqlist(pSeqlist p);//打印void PopBack(pSeqlist p);//尾删void PushFront(pSeqlist p,DataType d);//头插void PopFront(pSeqlist p);//头删void Insert(pSeqlist p, int pos,DataType d);//指定位置插入int Find(pSeqlist p, DataType d);//遍历查找void Remove(pSeqlist p, DataType d);//删除void ReverseSeqlist(pSeqlist p);//逆序void SortSeqlist(pSeqlist p);//冒泡排序int BinarySearch(pSeqlist p, DataType d);//二分查找,返回ret为元素所在列表位置下标void Expansion(pSeqlist p);//扩容#endif //_SEQLIST_H__

SeqList.c

#include "SeqList.h"void InitSeqlist(pSeqlist p)//初始化{    assert(p);    p->List = malloc(INIT_SZ*sizeof(Seqlist));    if (p->List==NULL)    {        perror("Failed to open up\n");        return ;    }    //memset(p, 0, sizeof(Seqlist));    p->sz=0;    p->capacity=INIT_SZ;}void Expansion(pSeqlist p)//扩容{    DataType *tmp = realloc(p->List, (p->capacity+ADD_SZ)*sizeof(Seqlist));    assert(p);    if(tmp==NULL)    {        perror("Failed to add\n");        return ;    }    p->List=tmp;    p->capacity+=ADD_SZ;}void PushBack(pSeqlist p, DataType d)//尾插{    assert(p);    if(p->sz==p->capacity)    {        Expansion(p);        printf("扩容成功\n");    }    p->List[p->sz]=d;    p->sz++;    }void PrintSeqlist(pSeqlist p)//打印{    int i=0;    assert(p);    if(p->sz==0)    {        printf("列表为空\n");        return ;    }    for (i=0; i<p->sz; i++)    {        printf(TYPES,p->List[i]);    }    printf("\n");}void PopBack(pSeqlist p)//尾删{    assert(p);    //p->List[p->sz-1]=0;    p->sz--;}void PushFront(pSeqlist p,DataType d)//头插{    int i=0;    assert(p);    if(p->sz==p->capacity)    {        Expansion(p);        printf("扩容成功\n");    }    for (i=p->sz; i>0; i--)    {        p->List[i]=p->List[i-1];    }    p->List[0]=d;    p->sz++;}void PopFront(pSeqlist p)//头删{    int i=0;    assert(p);    for(i=0; i<p->sz-1; i++)    {        p->List[i]=p->List[i+1];    }    p->sz--;}void Insert(pSeqlist p, int pos,DataType d)//指定位置插入{    int i = 0;    assert(p);    if(p->sz==p->capacity)    {        Expansion(p);        printf("扩容成功\n");    }    for (i=p->sz; i>pos; i--)    {        p->List[i]=p->List[i-1];    }    p->List[pos]=d;    p->sz++;}int Find(pSeqlist p, DataType d)//遍历查找{    int i = 0;    assert(p);    for (i=0; i<p->sz; i++)    {        if(p->List[i]==d)        {            return i;        }    }    if(i==p->sz)    {        printf("没找着\n");    }    return -1;}void Remove(pSeqlist p, DataType d)//删除{       int ret=Find(p, d);    assert(p);    if(ret==-1)    {        printf("没有此元素\n");    }    else    {        int i = 0;        for(i=ret; i<p->sz-1; i++)        {            p->List[i]=p->List[i+1];        }        p->sz--;    }}void ReverseSeqlist(pSeqlist p)//逆序{    int left=0;    int right=p->sz-1;    assert(p);    while (left<right)    {        DataType tmp = p->List[left];        p->List[left] = p->List[right];        p->List[right] = tmp;        left++;        right--;    }}void SortSeqlist(pSeqlist p)//冒泡排序{    int i=0;    assert(p);    for (i=0; i<p->sz-1; i++)    {        int j=0;        for (j=0; j<p->sz-i-1; j++)        {            if(p->List[j]>p->List[j+1])            {                DataType tmp = p->List[j];                p->List[j] = p->List[j+1];                p->List[j+1] = tmp;            }        }    }}int BinarySearch(pSeqlist p, DataType d)//二分查找,默认顺序从小到大{    int left=0;    int right=p->sz-1;    assert(p);    while (left<=right)    {        int mid = left+(right-left)/2;        if(p->List[mid]>d)        {            right=mid;        }        else if(p->List[mid]<d)        {            left=mid;        }        else        {            return mid;        }    }    return -1;}

test.c

#include "SeqList.h"void test1(){    Seqlist seqlist;    int ret = 0;    InitSeqlist(&seqlist);//初始化    PushBack(&seqlist, 1);//尾插    PushBack(&seqlist, 2);    PushBack(&seqlist, 3);    PushBack(&seqlist, 4);    printf("尾插1、2、3、4:");    PrintSeqlist(&seqlist);//打印    PopBack(&seqlist);//尾删  PopBack(&seqlist);    printf("尾删:");    PrintSeqlist(&seqlist);    PushFront(&seqlist, 0);//头插    printf("头插0:");    PrintSeqlist(&seqlist);    PopFront(&seqlist);//头删    printf("头删:");    PrintSeqlist(&seqlist);    Insert(&seqlist, 1, 5);//指定位置插入    printf("在1位置插入5:");    PrintSeqlist(&seqlist);    ret = Find(&seqlist, 5);    printf("ret = %d\n", ret);    Remove(&seqlist, 5);//删除    printf("删除5这个元素:");    PrintSeqlist(&seqlist);}void test2(){    Seqlist seqlist;    int ret = 0;    InitSeqlist(&seqlist);//初始化    PushBack(&seqlist, 1);//尾插    PushBack(&seqlist, 2);    PushBack(&seqlist, 3);    PushBack(&seqlist, 4);    PrintSeqlist(&seqlist);    ReverseSeqlist(&seqlist);//逆序    printf("逆序:");    PrintSeqlist(&seqlist);    SortSeqlist(&seqlist);//排序    printf("排序:");    PrintSeqlist(&seqlist);    ret = BinarySearch(&seqlist, 2);//二分查找,返回ret为元素所在列表位置下标    printf("二分查找元素2:");    printf("ret = %d\n", ret);}int main(){    test1();    //test2();    return 0;}

test1

这里写图片描述

test2

这里写图片描述

原创粉丝点击