voidInitList(SqList *&);// 初始化线性表voidDestroyList(SqList *&);// 销毁线性表boolListEmpty(SqList *);// 判定线性表是否为空intListLength(SqList *);// 获得线性表长度voidShowList(SqList *);// 输出线性表boolGetElem(SqList *,int, ElemType &);// 获得第i个元素的值,存储到e中intLocateElem(SqList *, ElemType);// 查找元素e第一次出现的位置,不存在返回0boolListInsert(SqList *&,int, ElemType);// 再第i个位置插入元素eboolListDelete(SqList *&,int, ElemType &);// 删除第i个元素,并存储到e中voidInitList(SqList *&L){
L =(SqList *)malloc(sizeof(SqList));
L -> length =0;}voidDestroyList(SqList *&L){free(L);}boolListEmpty(SqList * L){return L -> length ==0;}intListLength(SqList * L){return L -> length;}voidShowList(SqList * L){printf("[L");for(int i =0; i < L -> length; i++){printf(" -> %d", L -> data[i]);}printf("]\n");}boolGetElem(SqList * L,int i, ElemType &e){if(i <1|| i > L -> length)returnfalse;
e = L -> data[i -1];returntrue;}intLocateElem(SqList * L, ElemType e){int i;for(i =0; i < L -> length && L -> data[i]!= e; i++);if(i == L -> length)return0;return i +1;}boolListInsert(SqList *&L,int i, ElemType e){if(i <1|| i > L -> length +1|| L -> length == MaxSize)returnfalse;for(int j = L -> length; j >= i; j--) L -> data[j]= L -> data[j -1];
L -> data[--i]= e;
L -> length++;returntrue;}boolListDelete(SqList *&L,int i, ElemType &e){if(i <1|| i > L -> length)returnfalse;
e = L -> data[i -1];for(int j = i -1; j <= L -> length; j++) L -> data[j]= L -> data[j +1];
L -> length--;returntrue;}
顺序表的基本算法
voidCreateList(SqList *&, ElemType [],int);// 从数组中创建线性表,时间复杂度o(n)voidDeleteElem1(SqList *&, ElemType);// 删除线性表中所有元素x,时间复杂度o(n),算法1voidDeleteElem2(SqList *&, ElemType);// 删除线性表中所有元素x,时间复杂度o(n),算法2voidClassify1(SqList *&);// 将链表中所有值为奇数的元素移动到值为偶数的元素前,时间复杂度o(n),算法1voidClassify2(SqList *&);// 将链表中所有值为奇数的元素移动到值为偶数的元素前,时间复杂度o(n),算法2,区间划分法voidCreateList(SqList *&L, ElemType a[],int n){
L =(SqList *)malloc(sizeof(SqList));int i =0;while(i < n && i < MaxSize){
L -> data[i]= a[i];
i++;}
L -> length = i;}voidDeleteElem1(SqList *&L, ElemType x){// 将所有元素前移,前移距离等于删除元素数量int k =0;for(int i =0; i < L -> length; i++){if(L -> data[i]== x) k++;else L -> data[i - k]= L -> data[i];}
L -> length -= k;}voidDeleteElem2(SqList *&L, ElemType x){// 重构顺序表,将所有值不等于x的元素重新构建至sqlist中int k =0;// 重构指针for(int i =0; i < L -> length; i++){if(L -> data[i]!= x){
L -> data[k]= L -> data[i];
k++;}}
L -> length = k;}voidClassify1(SqList *&L){// 设置前后指针i,j// 将前指针偶数与后指针奇数进行交换int i =0, j = L -> length -1;while(i < j){while(i < j &&(L -> data[i]&1)) i++;// 从前向后查找偶数,奇数跳过while(i < j &&!(L -> data[j]&1)) j--;// 从后向前查找奇数if(i < j){// 交换奇偶元素
ElemType temp = L -> data[i];
L -> data[i]= L -> data[j];
L -> data[j]= temp;}}}voidClassify2(SqList *&L){Classify2(SqList *&sqlist){// 划分奇偶区间 奇数j[0...j],偶数i[j + 1...]// 遍历查找到偶数区间的奇数后data[i],交换data[j + 1],a[i]int j =-1;for(int i =0; i < L -> length; i++){if(L -> data[i]&1){
j++;if(i != j){
ElemType temp = L -> data[i];
L -> data[i]= L -> data[j];
L -> data[j]= temp;}}}}