实现一个静态顺序表,首先,要定义一个保存数据的数组,保存在结构体中,用size来存储数组中的元素个数,

typedefstructSeqList{DataTypearray[MAX_SIZE];size_tsize;}SeqList;

首先来实现一下静态顺序表的初始化函数,可以借用系统的memset函数来实现,开辟一块空间全部初始化为0,没有存入数据所以size也为0

voidInitSeqList(SeqList*pSeq){assert(pSeq);memset(pSeq->array,0,sizeof(DataType)*MAX_SIZE);pSeq->size=0;}

然后简单的实现一下尾插的函数,把顺序表和需要插入的数据传给函数

voidPushBack(SeqList*pSeq,DataTypex){assert(pSeq);//断言顺序表if(pSeq->size>=MAX_SIZE)//判断顺序表是否已满,满的话就输出这个顺序表已满并返回程序{printf("TheSeqListisFull.\n");return;}pSeq->array[pSeq->size++]=x;//把需要尾插的数据插入顺序表末尾的下一个元素}尾删函数,只需要把顺序表传给函数,voidPopBack(SeqList*pSeq){assert(pSeq);//断言,养成良好的代码习惯,方便出错时的检查工作if(pSeq->sizearray[pSeq->size]=0;//将顺序表的最后一个元素置为0,--pSeq->size;//size减一}实现简单的头插函数voidPushFront(SeqList*pSeq,DataTypex){intbegin=pSeq->size;//保存顺序表的元素个数assert(pSeq);if(pSeq->size>=MAX_SIZE){printf("TheSeqListisFull.\n");return;}for(;begin>=0;--begin)//从顺序表末尾开始移动元素,把第一个元素的位置空出来{pSeq->array[begin]=pSeq->array[begin-1];}pSeq->array[0]=x;//将第一个位置插入需要插入的元素pSeq->size++;//size加一}简单的头删函数,原理与头插相似,从第一个位置开始移动元素,覆盖第一个位置,将size减一voidPopFront(SeqList*pSeq){intbegin=0;assert(pSeq);if(pSeq->size<=0){printf("TheSeqListisNULL");return;}for(;beginsize;begin++){pSeq->array[begin]=pSeq->array[begin+1];}pSeq->size--;}//实现一个查找函数,如果找到了,就返回它的下标,如果没找到,就返回-1intFind(SeqList*pSeq,size_tpos,DataTypex){inti=0;assert(pSeq);for(;i<pSeq->size;++i){if(pSeq->array[i]==x){returni;}}return-1;}//插入函数,从顺序表末尾开始向后挪动元素,直到pos位置,将pos位置空出来插入元素voidInsert(SeqList*pSeq,intpos,DataTypex){intbegin=pSeq->size-1;assert(pSeq);assert(possize);if(pos>=MAX_SIZE){printf("TheSeqListisFull");return;}for(;begin>=pos;begin--){pSeq->array[begin+1]=pSeq->array[begin];}pSeq->array[pos]=x;pSeq->size++;}//删除函数voidErase(SeqList*pSeq,size_tpos){assert(pSeq);if(pSeq->size<0){printf("TheSeqListisempty\n");return;}assert(pos<pSeq->size);inti=pos;//定义一个i用开保存当前位置for(;i<pSeq->size;i++)//从当前位置开始向后,依次用之后的元素覆盖前面的元素,达到删除它的作用{pSeq->array[i]=pSeq->array[i+1];}--(pSeq->size);}//删除指定元素intRemove(SeqList*pSeq,DataTypex){intpos;assert(pSeq);if(pSeq->sizesize<=0){printf("TheSeqListisempty\n");return;}pos=Find(pSeq,0,x);while(pos!=-1){Erase(pSeq,pos);pos=Find(pSeq,pos,x);//把顺序表,当前位置和要删除的元素传给Find函数,循环查找删除,直到把该元素全部删除}}//但上面那种方法不够高效,没删除一次就需要把之后的元素全部向前挪动一次,频繁的挪动导致该函数比较低效,用count计数,计算每个元素前出现几次需要删除的元素,就将该元素向前挪动几个位置voidRemoveAll(SeqList*pSeq,DataTypex){intcount=0;intbegin=0;assert(pSeq);for(;begin<pSeq->size;++begin){if(pSeq->array[begin]==x){++count;}else{pSeq->array[begin-count]=pSeq->array[begin];}}pSeq->size-=count;}//冒泡排序函数,参考数组的冒泡排序voidBubblesort(SeqList*pSeq)//冒泡排序{assert(pSeq);inti=0;intj=0;for(;i<pSeq->size;i++){for(j=0;j<pSeq->size-i;j++){if(pSeq->array[j]<pSeq->array[j-1]){DataTypetemp;temp=pSeq->array[j-1];pSeq->array[j-1]=pSeq->array[j];pSeq->array[j]=temp;}}}}//选择排序函数voidSelectsort(SeqList*pSeq){assert(pSeq);inti=0;intj=0;intmin=0;for(j=0;j<pSeq->size-1;++j){min=j;for(i=j+1;i<pSeq->size;++i){if(pSeq->array[i]<pSeq->array[min]){min=i;}}Swap(&pSeq->array[min],&pSeq->array[j]);}}//但上面那个函数比较低效,我在下面实现了一个选择排序函数,每次循环可以找出最大值和最小值,有效的减少循环次数,提该函数效率voidSelectsort_OP(SeqList*pSeq){inti=0;intmin=0;intmax=0;intleft=0;intright=pSeq->size-1;assert(pSeq);while(left<right){min=left;max=right;for(i=left;iarray[i]<pSeq->array[min]){Swap(&pSeq->array[i],&pSeq->array[left]);}if(pSeq->array[i]>pSeq->array[max]){Swap(&pSeq->array[i],&pSeq->array[right]);}}left++;right--;}}//在下面,我简单的实现了一下二分查找,一定要注意循环条件intBinarysearch(SeqList*pSeq,DataTypex){assert(pSeq);intleft=0;intright=pSeq->size-1;while(left<=right){intmid=left-(left-right)/2;//避免了溢出的问题if(x<pSeq->array[mid]){right=mid;}elseif(x>pSeq->array[mid]){left=mid+1;}else{returnmid;}}return-1;}//下面,是动态顺序表的各个函数的简单实现typedefstructSeqList{DataType*array;//数据块指针size_tsize;//当前有效数据个数size_tcapicity;//容量}SeqList;//这个是检查容量,不够时动态开辟空间的函数,借助了系统的relloc函数voidCheckCapicity(SeqList*pSeq){if(pSeq->size>=pSeq->capicity){pSeq->capicity=2*pSeq->capicity;pSeq->array=(DataType*)realloc(pSeq->array,pSeq->capicity*sizeof(DataType));}}其他函数的实现大致都是类似的,只是动态开辟空间,在涉及到元素插入删除时需要检查容量