静(动)态顺序表的实现

来源:互联网 发布:霍华德职业生涯数据 编辑:程序博客网 时间:2024/05/17 22:18

静态顺序表和动态顺序表是其他表结构的基础

静态顺序表

SeqList.h

#ifndef __SEQLIST__H__#define __SEQLIST__H__#include <stdio.h>#include <string.h>#include <assert.h>#define MAX 100 typedef int DateType;typedef struct SeqList {DateType data[MAX];int sz;}SeqList,*pSeqList;void InitSeqlist(pSeqList ps);void PushBack(pSeqList ps, DateType d);void PrintSeqist(const pSeqList ps);void PopBack(pSeqList ps);void PushFront(pSeqList ps, DateType d);void PopFront(pSeqList ps);void Insert(pSeqList ps, int pos, DateType d);int Find(pSeqList ps, DateType d);void Remove(pSeqList ps, DateType d);void ReverseSeqlist(pSeqList ps);void SortSeqlist(pSeqList ps);int BinarySearch(pSeqList ps, DateType d);#endif//__SEQLIST__H__

SeqList.c

#include "SeqList.h"void InitSeqlist(pSeqList ps){assert(ps);memset(ps->data,0,sizeof(ps->data[0])*MAX);ps->sz=0;return;}void PrintSeqist(const pSeqList ps){int i = 0;for(i=0;i<ps->sz;i++){printf("%d ",ps->data[i]);}printf("\n");return;}void PushBack(pSeqList ps, DateType d){assert(ps);if(ps->sz==MAX){return;}ps->data[ps->sz]=d;ps->sz++;return;}void PopBack(pSeqList ps){assert(ps);if(ps->sz==0){return;}ps->sz--;return;}void PushFront(pSeqList ps, DateType d){int i = 0;assert(ps);if (ps->sz==MAX){return;}for (i=ps->sz;i>0;i--)//在这种有判断的地方留一个心,可以假设最后那个值,看是否合适{ps->data[i]=ps->data[i-1];}ps->data[0]=d;ps->sz++;return;}void PopFront(pSeqList ps){int i = 0;assert(ps);if (ps->sz==0){return;}for (i=0;i<ps->sz-1;i++){ps->data[i]=ps->data[i+1];}ps->sz--;return;}void Insert(pSeqList ps, int pos, DateType d){int i = 0;assert(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++;return;}int Find(pSeqList ps, DateType d){int i = 0;assert(ps);if(ps->sz!=0){for (i=0;i<ps->sz;i++){if(ps->data[i]==d)return i;}}return -1;}void Remove(pSeqList ps, DateType d){int ret = 0;int i = 0;assert(ps);if (ps->sz==0){return;}ret = Find(ps,d);if (ret!=-1){for (i=ret;i<ps->sz-1;i++){ps->data[i]=ps->data[i+1];}ps->sz--;}return;}void ReverseSeqlist(pSeqList ps){int left = 0;int right = ps->sz-1;int tmp = 0;assert(ps);if (ps->sz==0){return;}while(left<right){tmp = ps->data[right];ps->data[right] = ps->data[left];ps->data[left] = tmp;left++;right--;}return;}void SortSeqlist(pSeqList ps){int i = 0;int j = 0;int tmp = 0;assert(ps);if (ps->sz==0){return;}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]){tmp = ps->data[j];ps->data[j] = ps->data[j+1];ps->data[j+1] = tmp;}}}return;}int BinarySearch(pSeqList ps, DateType d){int left = 0;int right = ps->sz-1;int mid = 0;SortSeqlist(ps);assert(ps);if (ps->sz!=0){while (left<=right)//注意是小于等于{mid = (left+right)/2;if (ps->data[mid]==d){return mid;}else if (ps->data[mid]<d){left = mid+1;}else{right = mid-1;}}}return -1;}
test.c

#include "SeqList.h"void test(){SeqList s;int ret = 0;InitSeqlist(&s);PushBack(&s,1);PushBack(&s,3);PushBack(&s,2);PushBack(&s,4);PrintSeqist(&s);return;}int main(){test();return 0;}

上述功能均测试通过,有兴趣可以自行再测试。

动态顺序表

SeqList_D.h

#ifndef __SEQLIST_D_H__#define __SEQLIST_D_H__#include <stdio.h>#include <stdlib.h>#include <assert.h>typedef int DataType;#define DEFALUT_INC 5typedef struct SeqList{DataType* pdata;//指向数据的存储位置int sz;//有效个数int capacity;//容量}SeqList, *pSeqList;//初始化顺序表void InitSeqList(pSeqList ps);//初始化表void DestroySeqList(pSeqList ps);//销毁表void PushBack(pSeqList ps, DataType d);//在尾部添加void PrintSeqList(const pSeqList ps);//打印顺序表void PopBack(pSeqList ps);//删除尾部元素void PushFront(pSeqList ps, DataType d);//在头部添加void PopFront(pSeqList ps);//删除头部元素void Insert(pSeqList ps, int pos, DataType d);//在输入位置前端插入int Find(pSeqList ps, DataType d);//查找某元素位置void Remove(pSeqList ps, DataType d);//删除输入的元素void ReverseSeqlist(pSeqList ps);//逆序顺序表void SortSeqlist(pSeqList ps);//排序顺序表(冒泡)int BinarySearch(pSeqList ps, DataType d);//二分查找#endif//__SEQLIST_D_H__


SeqList.c

#include "SeqList_D.h"void InitSeqList(pSeqList ps){ps->sz=0;//ps->capacity=DEFALUT_INC;ps->pdata=(DataType*)malloc(sizeof(DataType)*(DEFALUT_INC));if(ps->pdata==NULL)return;}void DestroySeqList(pSeqList ps){ps->sz=0;ps->capacity=DEFALUT_INC;free(ps->pdata);//释放这个,并且之后要给空值ps->pdata=NULL;}int Check_Capacity(pSeqList ps){DataType* temp = ps->pdata;//预防开辟失败assert(ps);if(ps->capacity==ps->sz){ps->pdata=(DataType*)realloc(ps->pdata,sizeof(DataType)*(ps->capacity+DEFALUT_INC));//realloc中还有个参数是内存起始地址if(ps->pdata==NULL){ ps->pdata=temp;return -1;} else{ps->capacity=ps->capacity+DEFALUT_INC;}}return 1;}void PushBack(pSeqList ps, DataType d){int ret= Check_Capacity(ps);//这个动态开辟也就是在添加时候需要assert(ps);if(ret==1){ps->pdata[ps->sz]=d;ps->sz++;}}void PrintSeqList(const pSeqList ps){int i = 0;for(i=0;i<ps->sz;i++){printf("%d ",ps->pdata[i]);}printf("\n");return;}void PopBack(pSeqList ps){assert(ps);if(ps->sz==0){return;}ps->sz--;return;}void PushFront(pSeqList ps, DataType d){int i = 0;int ret = Check_Capacity(ps);assert(ps);if(ret==1){for (i=ps->sz;i>0;i--){ps->pdata[i]=ps->pdata[i-1];}ps->pdata[0]=d;ps->sz++;}}void PopFront(pSeqList ps){int i = 0;assert(ps);if (ps->sz==0){return;}for (i=0;i<ps->sz-1;i++){ps->pdata[i]=ps->pdata[i+1];}ps->sz--;return;}void Insert(pSeqList ps, int pos, DataType d){int i = 0;int ret = Check_Capacity(ps);assert(ps);if (ret==1){for (i=ps->sz;i>pos;i--){ps->pdata[i]=ps->pdata[i-1];}ps->pdata[pos]=d;ps->sz++;}return;}int Find(pSeqList ps, DataType d){int i = 0;assert(ps);if(ps->sz!=0){for (i=0;i<ps->sz;i++){if(ps->pdata[i]==d)return i;}}return -1;}void Remove(pSeqList ps, DataType d){int ret = 0;int i = 0;assert(ps);if (ps->sz==0){return;}ret = Find(ps,d);if (ret!=-1){for (i=ret;i<ps->sz-1;i++){ps->pdata[i]=ps->pdata[i+1];}ps->sz--;}return;}void ReverseSeqlist(pSeqList ps){int left = 0;int right = ps->sz-1;int tmp = 0;assert(ps);if (ps->sz==0){return;}while(left<right){tmp = ps->pdata[right];ps->pdata[right] = ps->pdata[left];ps->pdata[left] = tmp;left++;right--;}return;}void SortSeqlist(pSeqList ps){int i = 0;int j = 0;int tmp = 0;assert(ps);if (ps->sz==0){return;}for (i=0;i<ps->sz-1;i++){for (j=0;j<ps->sz-1-i;j++){if (ps->pdata[j]>ps->pdata[j+1]){tmp = ps->pdata[j];ps->pdata[j] = ps->pdata[j+1];ps->pdata[j+1] = tmp;}}}return;}int BinarySearch(pSeqList ps, DataType d){int left = 0;int right = ps->sz-1;int mid = 0;SortSeqlist(ps);assert(ps);if (ps->sz!=0){while (left<=right){mid = (left+right)/2;if (ps->pdata[mid]==d){return mid;}else if (ps->pdata[mid]<d){left = mid+1;}else{right = mid-1;}}}return -1;}

test.c

#include "SeqList_D.h"void test(){SeqList s;InitSeqList(&s);PushBack(&s,1);PushBack(&s,2);PushBack(&s,5);PushBack(&s,4);PushBack(&s,3);PrintSeqList(&s);SortSeqlist(&s);PrintSeqList(&s);return;}int main(){test();return 0;}