【顺序表】用c语言简单实现顺序表

来源:互联网 发布:云南管家婆软件总代理 编辑:程序博客网 时间:2024/05/29 14:23

今天,写了一个简单的顺序表,跟大家分享一下(我是先写的静态,后改的动态,中间的一些注释是原来的静态):

test.h#ifndef  __SEPLIST_H__#define  __SEPLIST_H__#include<stdio.h>#include<stdlib.h>#include<assert.h>#include<string.h>//#define MAX 100#define DEFAULT_SZ 3  //当前默认有效值#define ISC_SZ 2      //动态分配默认增长个数typedef int DataType;typedef struct SeqList{    DataType* data;    //DataType data[MAX];    int sz;  //当前有效的个数    int capatity; //容量}SeqList,*pSeqList;void InitSeqList(pSeqList plist);//初始化顺序表void PushBack(pSeqList plist,DataType d);//从尾部插入数据void PopBack(pSeqList plist);//从尾部删除数据void PushFront(pSeqList plist,DataType d);//从头部插入数据void PopFront(pSeqList plist);//从头部删除数据int  Find(pSeqList plist, DataType d);//查找指定数void Remove(pSeqList plist, DataType d);//指定元素删除void RemoveAll(pSeqList plist, DataType d);//删除指定的所有元素void Show(pSeqList plist);//打印顺序表void BubbleSort(pSeqList plist);//冒泡排序int BinarySearch(pSeqList plist, DataType d);//非递归实现二分查找int printSearch(pSeqList plist, int left, int right, DataType d);//递归实现二分查找void Insert(pSeqList plist, int pos, DataType d);//指定位置插入void ReverseList(pSeqList plist);//反向旋转void DestroySeqList(pSeqList plist);//清空动态顺序表void CheckSeqList(pSeqList plist);//判断动态顺的序表的空间是否已满,满的话进行扩容  #endif
list.c#include"test.h"void CheckSeqList(pSeqList plist){    if (plist->sz==plist->capatity)    {        DataType *tmp = (DataType *)realloc(plist->data, (plist->capatity + ISC_SZ)*sizeof(SeqList));        if(tmp == NULL)        {            perror("realloc");            return;        }        plist->data= tmp;        plist->capatity += ISC_SZ;    }}void InitSeqList(pSeqList plist){    plist->data = (DataType *)malloc(sizeof(pSeqList)*DEFAULT_SZ);    if (plist->data == NULL)    {        perror("malloc");        return;    }    plist->sz = 0;    plist->capatity = 0;    memset(plist->data, 0, sizeof(pSeqList)*DEFAULT_SZ);}void PushBack(pSeqList plist,DataType d){    assert(plist);    CheckSeqList(plist);    /*if (plist->sz == MAX)    {        printf("顺序表已满!\n");        return;    }*/    plist->data[plist->sz] = d;    plist->sz++;}void PopBack(pSeqList plist){    assert(plist);    if (plist->data == NULL)    {        printf("顺序表为空!\n");        return;    }    plist->data[plist->sz - 1] = 0;    plist->sz--;}void PushFront(pSeqList plist,DataType d){    int i = 0;    assert(plist);    /*if (plist->sz == MAX)    {        printf("顺序表已满!\n");        return;    }*/    CheckSeqList(plist);    for (i = plist->sz; i > 0; i--)    {        plist->data[i] = plist->data[i - 1];    }    plist->data[0] = d;    plist->sz++;}void PopFront(pSeqList plist){    int i = 0;    assert(plist);    if (plist->data == NULL)    {        printf("顺序表为空!\n");        return;    }    for (i = 0; i < plist->sz - 1; i++)    {        plist->data[i] = plist->data[i + 1];    }    plist->sz--;}void Show(pSeqList plist){    int i = 0;    assert(plist);    for (i = 0; i < plist->sz; i++)    {        printf("%d ", plist->data[i]);    }}int Find(pSeqList plist, DataType d){    int i = 0;    assert(plist);    for (i = 0; i < plist->sz; i++)    {        if (plist->data[i] == d)            return i;    }    return -1;}void Remove(pSeqList plist, DataType d){    int pos=Find(plist,d);    assert(plist);    if (pos != -1)    {        int i = 0;        for (i = pos; i < plist->sz-1; i++)        {            plist->data[i] = plist->data[i + 1];        }        plist->sz--;    }}void RemoveAll(pSeqList plist, DataType d){    int pos = Find(plist, d);    assert(plist);    while ( pos!= -1)    {        int i = 0;        for (i = pos; i < plist->sz - 1; i++)        {            plist->data[i] = plist->data[i + 1];        }        plist->sz--;        pos = Find(plist, d);    }}void BubbleSort(pSeqList plist){    int i = 0;    int j = 0;    assert(plist);    for (i = 0; i < plist->sz; i++)    {        for (j = 0; j < plist->sz - i - 1; j++)        {            if (plist->data[j]>plist->data[j + 1])            {                int tmp = plist->data[j];                plist->data[j] = plist->data[j + 1];                plist->data[j + 1] = tmp;            }        }    }}int BinarySearch(pSeqList plist, DataType d){    int left = 0;    int right = plist->sz - 1;    assert(plist);    while (left <= right)    {        int mid = (left + right) / 2;        if (plist->data[mid] > d)        {            right = mid - 1;        }        else if (plist->data[mid] < d)        {            left = mid + 1;        }        else if (plist->data[mid] == d)        {            return mid;        }    }    return -1;}void Insert(pSeqList plist, int pos, DataType d){    int i = 0;    assert(plist);    CheckSeqList(plist);    for (i = plist->sz - 1; i>pos;i--)    {        plist->data[i] = plist->data[i - 1];    }    plist->data[pos] = d;}void ReverseList(pSeqList plist){    assert(plist);    int left = 0;    int right = plist->sz - 1;    while (left < right)    {        int tmp = plist->data[left];        plist->data[left] = plist->data[right];        plist->data[right] = tmp;        left++;        right--;    }}void DestroySeqList(pSeqList plist){    free(plist->data);    plist->data = NULL;}int printSearch(pSeqList plist, int left, int right, DataType d){    assert(plist);    while (left <= right)    {        int mid = (left + right) / 2;        if (plist->data[mid] > d)        {            return printSearch(plist, left, mid - 1, d);        }        else if (plist->data[mid] < d)        {            return printSearch(plist, mid + 1 , right, d);        }        else if (plist->data[mid] == d)        {            return mid;        }    }    return -1;}
test.c#include"test.h"extern struct SeqList sz;void test1(){    SeqList list;    int tmp = 0;    InitSeqList(&list);    PushBack(&list, 1);    PushBack(&list, 2);    PushBack(&list, 3);    PushBack(&list, 4);    PopBack(&list);    PushFront(&list, 7);    PushFront(&list, 6);    PushFront(&list, 5);    PopFront(&list);    Remove(&list, 6);    PushBack(&list, 2);    PushFront(&list, 2);    RemoveAll(&list, 2);    PushBack(&list, 4);    PushFront(&list, 5);    PushBack(&list, 8);    PushFront(&list, 0);    BubbleSort(&list);    Insert(&list, 2, 12);    /*tmp = BinarySearch(&list, 5);    printf("%d\n", tmp);*/    /*tmp = Find(&list, 6);    printf("%d",tmp);*/    Show(&list);}void test2(){    SeqList list;    int tmp = 0;    InitSeqList(&list);    PushBack(&list, 1);    PushBack(&list, 2);    PushBack(&list, 3);    PushBack(&list, 4);    ReverseList(&list);    tmp = printSearch(&list,0, list.sz, 4);    printf("%d\n", tmp);    Show(&list);}int main(){    /*test1();*/    test2();    system("pause");    return 0;}
0 0