1 //顺序表节点的定义 2 typedef struct 3 { 4 datatype data[MAXSIZE]; //数组容量的上限 5 int len; //记录最后一个元素的位置,相当于一个指针,表空时len=-1 6 }SeqList; 7 SeqlLst L; //定义一个顺序表L,表长n = L.len+1 8 SeqList *L; //定义一个指向Seqlist类型的指针,L为指针变量,即顺序表的首地址 9 10 //顺序表的初始化(initialize) 11 SeqList *Init_SeqList() 12 { 13 SeqList *L; 14 L = malloc(sizeof(SeqList)); //动态分配存储空间 15 L->len = -1; 16 return L; 17 } 18 19 //插入操作(指在表的第i个位置前插入值为e的新元素,i的有效范围1<=i<=n+1,时间复杂度O(n)) 20 int Insert_SeqList(SeqList *L, int i, datatype e) 21 { 22 int j; 23 if(L->len == MAXSIZE-1) 24 { 25 printf("表满溢出"); return -1; //表空间已满,不能插入 26 } 27 if(i<1 || i>L->len + 2) //检查插入位置i是否有效 28 { 29 printf("位置错"); return 0; 30 } 31 for(j = L->len; j > i-1; j--) //在数组中,第i个元素的下标为i-1 32 L->data[j+1] = L->data[j]; //节点往后移动一个位置 33 L->data[k-1] = e; //插入新元素e 34 L->len++; //len仍指向最后一个元素 35 return 1; //插入操作成功,返回 36 } 37 38 //删除操作(指将中第i个位置从线性表中删除掉,i的有效范围1<=i<=n,时间复杂度O(n)) 39 int Delete_SeqList(SeqList *L, int i) 40 { 41 int j; 42 if(i<1 || i>L->len + 1) //检查空表及删除位置的合法性 43 { 44 printf("不存在第i个元素"); return 0; 45 } 46 for(j = i; j <= L->len; j++) 47 L->data[j-1] = L->data[j]; //节点向前移动一个位置 48 L->len--; 49 return 1; //删除成功 50 } 51 52 //按值查找(指在线性表中查找是否存在与给定值相等的数据元素,时间复杂度O(n)) 53 int Locate_SeqList(SeqList *L, datatype e) 54 { 55 int i = 0; 56 while(i<=L.len && L->data[i] != e) 57 i++; 58 if(i > L->len) return -1; //查找失败 59 else return 1; //查找成功 60 } 61 62 //取表中元素(指根据所给序号i在线性表中查找相应数据元素,时间复杂度O(1)) 63 int Get_SeqList(SeqList *L, int i) 64 { 65 if(i < 1 && i > L->len+1) //检查查找位置的合法性 66 { 67 printf("不存在第i个元素"); return 0; 68 } 69 else return L->data[i-1]; 70 }
算法思路:
1.插入操作
(1)将an~ai顺序向后移动一个位置,即an移动到an+1的位置……ai移动到ai+1的位置,为待插入的新元素让出位置;
(2)将e放到空出的第i个位置;
(3)修改len指针,使之恒指向当前表中最后一个元素。
2.删除操作
(1)将ai+1~an顺序向前移动一个位置;
(2)修改len指针,使之仍指向当前表中最后一个元素。
3.按值查找
从第一个元素a1起依次与e比较,直到找到一个与相等的数据元素为止,返回它在顺序表中的存储下标;
若查遍整个表都没有找到与e相等的元素,则返回-1,表示查找失败。
4.取表中元素
首先确认所查找数据元素序号是否合法,若合法则直接返回对应元素值。否则报错。
亲爱的读者:如果觉得本文对你有所帮助,请点击推荐,分享给其他人!