动态顺序表的实现

来源:互联网 发布:加内特职业生涯总数据 编辑:程序博客网 时间:2024/06/06 00:39

上次实现静态的顺序表,今天我们来实现一下动态的顺序表(动态开辟内存空间)
SeqListD.h

#ifndef __SEQLISTD_H__#define __SEQLISTD_H__#include <stdio.h>#include <assert.h>#include <string.h>#include <stdlib.h>#define DEFAULT_SZ 2#define INC 2typedef int DataType;typedef struct SeqList{    DataType *data;    int sz;    int capacity;  //容量}SeqList, *pSeqList;  //pSeqList是SeqList*的重命名void InitSeqList(pSeqList ps);             //初始化void Checkcapacity(pSeqList ps);     //检查是否需要扩容void DestroySeqList(pSeqList ps);    //销毁void PushBack(pSeqList ps, DataType d);    //在尾部插入元素void PopBack(pSeqList ps);                 //在尾部删除元素void Display(const pSeqList ps);           //打印void PushFront(pSeqList ps, DataType d);   //在头部插入一个元素void PopFront(pSeqList ps);                //在头部删除一个元素int Find(pSeqList ps, DataType d);               //查找void Insert(pSeqList ps, DataType d, int pos);  //在指定位置插入元素void Remove(pSeqList ps, DataType d);           //删除指定的某个元素void RemoveAll(pSeqList ps, DataType d);        //删除所有指定的某个元素void Reverse(pSeqList ps);                      //逆序void Sort(pSeqList ps);                         //排序int BinarySearch(pSeqList ps, DataType d);      //二分查找#endif //__SEQLISTD_H__

SeqListD.c

#include "SeqListD.h"void InitSeqList(pSeqList ps)//初始化顺序表{    ps->sz = 0;    ps->data = malloc(DEFAULT_SZ*sizeof(DataType));    if(ps->data == NULL)    {        perror("use malloc");        exit(EXIT_FAILURE);    }    memset(ps->data, 0, sizeof(ps->data));    ps->capacity = DEFAULT_SZ;}void Checkcapacity(pSeqList ps){    if(ps->sz == ps->capacity)    {        DataType *ptr = realloc(ps->data, sizeof(DataType)*(ps->capacity+INC));        if(ptr == NULL)        {            perror("use realloc");            exit(EXIT_FAILURE);        }        else        {            ps->data = ptr;        }        ps->capacity += INC;    }}void DestroySeqList(pSeqList ps){    free(ps->data);    ps->data = NULL;    ps->sz = 0;    ps->capacity = 0;}void PushBack(pSeqList ps, DataType d){    assert(ps != NULL);    Checkcapacity(ps);    ps->data[ps->sz] = d;    ps->sz++;}void PopBack(pSeqList ps){    assert(ps != NULL);    if(ps->sz == 0)    {        return;    }    ps->sz--;}void PushFront(pSeqList ps, DataType d){    int i = 0;    assert(ps != NULL);    Checkcapacity(ps);    //if(ps->sz < MAX)    //{        memmove(ps->data+1,ps->data,sizeof(DataType)*(ps->sz));        /*for(i=ps->sz;i>0;i--)        {            ps->data[i] = ps->data[i-1];        }*/        ps->data[0] = d;        ps->sz++;    //}}void PopFront(pSeqList ps){    int i = 0;    assert(ps != NULL);    if(ps->sz == 0)    {        return;    }    for(i=0;i<ps->sz-1;i++)    {        ps->data[i] = ps->data[i+1];    }    ps->sz--;}int Find(pSeqList ps, DataType d)//遍历查找{    int i = 0;    assert(ps != NULL);    for(i=0; i<ps->sz; i++)    {        if(d == ps->data[i])            return i;    }    return -1;}void Insert(pSeqList ps, DataType d, int pos)//在指定位置插入元素{    int i = 0;    assert(ps != NULL);    Checkcapacity(ps);    /*if(ps->sz == MAX)    {        return;    }*/    for(i=ps->sz;i>pos;i--)    {        ps->data[i] = ps->data[i-1];    }    ps->data[pos] = d;    ps->sz++;}void Remove(pSeqList ps, DataType d) //删除指定元素{    int pos = 0;            assert(ps != NULL);    if(ps->sz == 0);    {        return;    }    pos = Find(ps, d);    if(pos != -1)    {        memmove(ps->data+pos, ps->data+pos+1, (ps->sz-pos-1)*sizeof(DataType));        ps->sz--;    }}void RemoveAll(pSeqList ps, DataType d){    int pos = 0;          assert(ps != NULL);    while(pos = Find(ps, d) != -1)    {        Remove(ps, d);    }}void Reverse(pSeqList ps)   //逆序{    DataType *left = ps->data;    DataType *right = ps->data + ps->sz - 1;    assert(ps != NULL);    while(left<right)    {        DataType tmp = *left;        *left = *right;        *right = tmp;        *left++;        *right--;    }}void Sort(pSeqList ps)  //排序(冒泡法){    int i = 0;    int j = 0;    assert(ps != NULL);    for(i=0; i<ps->sz-1; i++)    {        for(j=0; j<ps->sz-1-i; j++)        {            if(ps->data[j] > ps->data[j+1])            {                DataType tmp = ps->data[j];                ps->data[j] = ps->data[j+1];                ps->data[j+1] = tmp;            }        }    }}int BinarySearch(pSeqList ps, DataType d)  //二分查找(找到返回数字的下标,找不到返回-1){    int left = 0;    int right = ps->sz;    int mid = left+((right - left)>>1);    while(left <= right)    {        if(ps->data[mid]<d)        {            left = mid + 1;        }        else if(ps->data[mid]>d)        {            right = mid - 1;        }        else if(d == ps->data[mid])        {            return mid;        }    }    return -1;}void Display(const pSeqList ps){    int i = 0;    assert(ps != NULL);    for(i=0;i<ps->sz;i++)    {        printf("%d ",ps->data[i]);    }    printf("\n");}

测试
test.c

#include "SeqListD.h"void test1(){    SeqList my_list;    InitSeqList(&my_list);    PushBack(&my_list, 1);    PushBack(&my_list, 2);    PushBack(&my_list, 3);    PushBack(&my_list, 4);    Display(&my_list);    PopBack(&my_list);    Display(&my_list);    DestroySeqList(&my_list);}void test2(){    SeqList my_list;    InitSeqList(&my_list);    PushFront(&my_list, 1);    PushFront(&my_list, 2);    PushFront(&my_list, 3);    PushFront(&my_list, 4);    Display(&my_list);    PopFront(&my_list);    Display(&my_list);    PopFront(&my_list);    Display(&my_list);    DestroySeqList(&my_list);}void test3(){    int pos = 0;    SeqList my_list;    InitSeqList(&my_list);    PushFront(&my_list, 1);    PushFront(&my_list, 2);    PushFront(&my_list, 3);    PushFront(&my_list, 4);    pos = Find(&my_list, 1);    if(pos == -1)    {        printf("要查找的元素不存在\n");    }    else    {        Insert(&my_list, 6, pos);    }    Display(&my_list);    DestroySeqList(&my_list);}void test4(){    int pos = 0;    SeqList my_list;    InitSeqList(&my_list);    PushFront(&my_list, 1);    PushFront(&my_list, 2);    PushFront(&my_list, 3);    PushFront(&my_list, 4);    pos = Find(&my_list, 6);    if(pos == -1)    {        printf("要查找的元素不存在\n");    }    else    {        Remove(&my_list,pos);    }    Display(&my_list);    DestroySeqList(&my_list);}void test5(){    int pos = 0;    SeqList my_list;    InitSeqList(&my_list);    PushFront(&my_list, 3);    PushFront(&my_list, 2);    PushFront(&my_list, 3);    PushFront(&my_list, 4);    PushFront(&my_list, 3);    PushFront(&my_list, 1);    pos = Find(&my_list, 3);    if(pos == -1)    {        printf("要查找的元素不存在\n");    }    else    {        RemoveAll(&my_list,pos);    }    Display(&my_list);    DestroySeqList(&my_list);}void test(){    int pos = 0;    SeqList my_list;    InitSeqList(&my_list);    PushFront(&my_list, 3);    PushFront(&my_list, 2);    PushFront(&my_list, 3);    PushFront(&my_list, 4);    PushFront(&my_list, 3);    PushFront(&my_list, 1);    Display(&my_list);    Reverse(&my_list);    Display(&my_list);    Sort(&my_list);    Display(&my_list);    pos = BinarySearch(&my_list, 4);    printf("%d\n",pos);    DestroySeqList(&my_list);}int main(){    test1();    return 0;}

注:malloc开辟一块空间之后要记得去释放所开辟的空间,并制空
若mslloc开辟的空间不够用时用realloc函数去重新开辟新空间。
今天就到这,谢谢阅读!