知識點:
1:缺點
1)插入和刪除操作需要移動大量的元素 2)當線性表長度變化較大時,難以確定存儲空間的容量 3)任意造成存儲空間的碎片
2:優點
1)無須為表示表中元素之間的邏輯關系而增加額外的存儲空間。 2)可以快速的存取表中的任意位置的元素。
3:代碼中增加,刪除,是需要在原來線性表中進行,所以需要用到引用對原數據進行操作;不需要對原來數據進行的操作,我們直接對賦值后的局部變量(含有原線性表的所有數據)參數進行操作,即可
#include <stdio.h> #include <stdlib.h> #define initSize 20//順序表初始大小 typedef int elemType;
靜態存儲-(數組大小不變)
typedef struct { elemType data[initSize]; int length;//每增加一個數,length增加1 }
動態存儲-(動態分配存儲,以下代碼均為動態存儲)
typedef struct { elemType* elem;//動態分配空間首地址 int length;//線性表當前長 int listSize;//線性表最大長 }sqList;
初始化
void initSqList(sqList *l) { l->elem=(elemType *)malloc(initSize*sizeof(elemType)); if(!l->elem) { printf("動態分配內存失敗\n"); exit(0); } else { l->length=0; l->listSize=initSize; } printf("初始化成功\n"); }
銷毀
void destorySqList(sqList *l) { if(l->elem)free(l->elem);//釋放空間 l->elem=NULL;//指針指向空 printf("銷毀成功\n"); }
清空
void clearSqList(sqList *l) { l->length=0; printf("清空成功\n"); }
判空
int isEmptySqList(sqList l) { if(l.length==0) { return 0; } else { return 1; } }
求表長
//求表長 int getSqListLength(sqList l) { return l.length; }
按位置查找
elemType getSqListElem(sqList l,int i) { if(i<1||i>l.length) { printf("位置不合法!\n"); return 0; } else { printf("找到了:%d\n",l.elem[i-1]); return l.elem[i-1]; } }
按數據查找
elemType getSqListloc(sqList l,elemType e) { int i,flag=1; for(i=0;i<l.length;i++) { if(l.elem[i]==e) { flag=0; printf("所查元素位序為%d", i + 1); return i+1; } } if(flag) { printf("查詢無果"); return 0; } }
求前驅
elemType getSqListPre(sqList l,elemType cur_e,elemType *pre_e) { int i,k=-1; for(i=0;i<l.length;i++) { if(l.elem[i]==cur_e) { k=i-1; break; } } if(k>-1) { *pre_e=l.elem[k]; printf("前驅元素為%d\n", *pre_e); return pre_e; } if(k=-1) { printf("查詢無果"); return 0; } }
求后繼
elemType getSqListNext(sqList l,elemType cur_e,elemType *next_e) { int i,k=-1; for(i=0;i<l.length;i++) { if(l.elem[i]==cur_e) { k=i+1; break; } } if(k>-1) { *next_e=l.elem[k]; printf("前驅元素為%d\n", *next_e); return next_e; } if(k==-1) { printf("查詢無果"); return 0; } }
末尾插入元素
void insertSqListLastElem(sqList *l,elemType e) { int k=l->length; //不能大於順序表的當前儲存空間 否則開辟空間 if(k>=l->listSize) { printf("順序表已滿!\n");//如果數組超出listSize,就動態的開辟同樣大小空間末尾分配加入 l->elem=(elemType *)realloc(l->elem,(l->listSize+initSize)*sizeof(elemType)); if(!l->elem) { printf("分配空間失敗!\n"); return 0; } l->listSize+=initSize; } l->elem[k+1]=e; l->length++; }
指定位置插入元素
void insertSqListElem(sqList *l,int i,elemType e) { int k; if(i<1||i>l->length+1) { printf("插入位置%d不合法!\n", i); return 0; } if(l->length>=l->listSize) { printf("順序表已滿!\n");//如果數組超出listSize,就動態的分配加入 l->elem=(elemType *)realloc(l->elem,(l->listSize+initSize)*sizeof(elemType)); if(!l->elem) { printf("分配空間失敗!\n", i); return 0; } l->listSize+=initSize; } for(k=l->length;k>i-1;k--)//i之后元素往后挪 { l->elem[k]=l->elem[k-1]; } l->elem[i-1]=e; l->length++; }
末尾刪除
elemType deleteSqListLastElem(sqList* l) { l->length--; return l->length; }
指定位置刪除
elemType deleteSqListElem(sqList* l,int i,elemType* e) { int k; if(i<1||i>l->length) { printf("刪除位置%d不合法\n", i); return 0; } *e=l->elem[i-1]; for(k=i-1;k<l->length;k++)//i之后元素往前挪 { l->elem[k]=l->elem[k+1]; } l->length--; return *e; }
遍歷輸出
void ListTraverse(sqList l) //遍歷所有元素 { int i; if (isEmptySqList(l)) { printf("順序表為空\n"); return 0; } for (i = 0; i < l.length; i++) printf("%-5d", l.elem[i]); }