今天我们来学习一下顺序表的各种算法,希望大家能认真练习。
#pragma once #include<stdio.h> #include<stdlib.h> #include<assert.h> #include<Windows.h> typedef int DataType; #define MAX_SIZE (100) typedef struct SeqList{ DataType array[MAX_SIZE]; //存数据的空间 int size; //有效数据有多少个,当前可用的数组下标。 }SeqList; //初始化 void SeqListinit(SeqList *pSL) { assert(pSL!=NULL); //断言pSL不为空。 pSL->size=0; //将结构体初始为0. } //销毁 void SeqListDestroy(SeqList *pSL) { assert(pSL!=NULL); pSL->size=0; } //增删改查 //增 //尾插 void SeqListPushBack(SeqList *pSL,DataType data) { assert(pSL!=NULL); assert(pSL->size>0); //断言。 pSL->array[pSL->size++]=data; //直接将最后一个的后面的位置附上data,在给总长度加1. } // 头插 void SeqListPushFront(SeqList *pSL, DataType data) { int n=pSL->size; //定义一个变量n为有效数据个数。 assert(pSL!=NULL); assert(pSL->size>0); while(n>0) { pSL->array[n]=pSL->array[n-1]; //通过循环将所有值往后移一位。 n--; } pSL->array[n]=data; //再给第一个赋值data. pSL->size++; //总长度加1. } // 根据下标插入 void SeqListInsert(SeqList *pSL, int pos, DataType data) { int x=0; int i=0; assert(pSL!=NULL); assert(pSL->size>0); assert(pos>=0&&pos<=pSL->size); for(x=pSL->size-1;x>=pos;x--) //循环将下标以及之后的值全部向后移一位。 { pSL->array[x+1]=pSL->array[x]; } pSL->array[pos]=data; //再给pos位赋值data。 pSL->size++; } //尾删 void SeqListPopBack(SeqList *pSL) { assert(pSL!=NULL); assert(pSL->size>0); pSL->size--; //直接长度减一即可尾删成功。 } //头删 void SeqListPopFront(SeqList *pSL) { int p=0; assert(pSL!=NULL); assert(pSL->size>0); for(p=0;p<pSL->size-1;p++) { pSL->array[p]=pSL->array[p+1]; //从前往后的的将值往前移一位。 } pSL->size--; //总长度减一。 } //根据下标删除 void SeqListErase(SeqList *pSL,int pos) { int q; assert(pSL!=NULL); assert(pSL->size>0); for(q=pos;q<pSL->size-1;q++) //将下标以及之后的值向前移一位。 { pSL->array[q]=pSL->array[q+1]; } pSL->size--; //总长度减一。 } // 查询 // 返回遇到的第一个下标,如果没有遇到,返回 -1 int SeqListFind(SeqList *pSL, DataType data) { int i=0; assert(pSL!=NULL); assert(pSL->size>0); for(i=0;i<pSL->size;i++) { if(pSL->array[i]==data) //如果相等,返回该下标,否则输出-1. { return i; } } return -1; } //根据数据删除,只删除遇到的第一个。 void SeqListRemove(SeqList *pSL,DataType data) { int m=data; int i=0; int ret=0; assert(pSL!=NULL); assert(pSL->size>0); ret=SeqListFind(pSL,m); if(ret==-1) { printf("It has not this number!\n"); //如果ret=-1,则没有这个数,否则将这个数的下一个数赋给它。 } else { while(i<pSL->size-1){ pSL->array[i]=pSL->array[i+1]; i++; } } pSL->size--; //最后长度减一。 } // 根据数据删除,删除所有遇到的 void SeqListRemoveAll(SeqList *pSL, DataType data) { int i=0; int j=0; assert(pSL!=NULL); assert(pSL->size>0); for(i=0;i<pSL->size;i++) { if(pSL->array[i]!=data) { pSL->array[j]=pSL->array[i]; j++; } } pSL->size=j; } // 根据下标更新 void SeqListUpdate(SeqList *pSL, int pos, DataType data) { int e=pos; assert(pSL!=NULL); assert(pSL->size>0); pSL->array[e]=data; } // 判断是否为空,1 表示空, 0 表示不空 int SeqListEmpty(SeqList *pSL) { if(pSL->size==0) //如果有效数据为0,表示为空。 { return 1; } return 0; } // 返回数量 int SeqListSize(SeqList *pSL) { int count=0; assert(pSL!=NULL); assert(pSL->size>0); count=pSL->size; printf("%d\n",count); return 0; }这就是顺序表的静态情况。动态与它十分类似,大家自己模仿着练习一下就行了。