1、本代码实现与王道和严蔚敏老师的教材基本保持一致。此代码主要用于考研用,为简化代码,顺序表并没有像严蔚敏老师的教材上那样使用动态分配。
2、注意本代码中元素的位置i=(元素的下标+1)。即线性表中元素的位置是从1开始的,而数组中元素的下标是从0开始的。
所以插入位置的范围是(1=<i<=L.length+1),删除位置的范围是(1<=i<=L.length)。 (插入位置一般是在指定位置之前。)
(根据王道单科)
假设元素个数为n个:
在任意位置插入元素的概率为1/(n+1) | 在任意位置删除元素的概率为1/n
在i位置插入元素需移动(n-i+1)个元素 | 在i位置删除元素需移动(n-i)个元素
在任意位置插入元素的概率为1/(n+1) | 在任意位置删除元素的概率为1/n
有些看了天勤数据结构的同学可能会疑问,为什么天勤里面写的却是
在任意位置插入元素的概率为1/(n+1) | 在任意位置删除元素的概率为1/n
在i位置插入元素需移动(n-i)个元素 | 在i位置删除元素需移动(n-i-1)个元素
在任意位置插入元素的概率为1/(n+1) | 在任意位置删除元素的概率为1/n
这是因为天勤的书他的元素位置i也是从0开始的,因此它的元素的位置i=元素的下标。他的书其实很多地方都简化了代码。比如说没有再写ElemType,而是直接写int类型等等。
好了,让我们看看代码吧。
本代码实现函数有:
void InitList(Sqlist &L)
bool ListInsert(Sqlist &L,int i,ElemType e)
bool ListDelete(Sqlist &L,int i,ElemType &e)
bool getElem(Sqlist L,int i,ElemType &e)
int LocateElem(Sqlist L,ElemType e)
void ListLoad(Sqlist L)
#include<stdio.h> #define true 1 #define false 0 #define MaxSize 100 #define ElemType int #define Status int typedef struct{ ElemType data[MaxSize]; int length; }Sqlist; //构造一个空的线性表L void InitList(Sqlist &L){ L.length=0; } bool ListInsert(Sqlist &L,int i,ElemType e){ //将元素e插到顺序表L中第i个位置 if(i<1||i>L.length+1) return false; if(L.length>=MaxSize) return false; for(int j=L.length;j>=i;j--) L.data[j]=L.data[j-1]; L.data[i-1]=e; L.length++; return true; } bool ListDelete(Sqlist &L,int i,ElemType &e){ //删除L中第i个位置的元素 if(i<1||i>L.length) return false; e=L.data[i-1]; for(int j=i;j<L.length;j++) L.data[j-1]=L.data[j]; L.length--; return true; } //用e返回L中第i个数据元素的值 bool getElem(Sqlist L,int i,ElemType &e){ if(i<1||i>L.length)return false; e=L.data[i-1]; return true; } //返回L中第一个元素值等于e的位置 int LocateElem(Sqlist L,ElemType e){ int i; for(i=0;i<L.length;i++) if(L.data[i]==e) return i+1; //返回所找元素的位置 return 0; //退出循环,没找到这个元素 } void ListLoad(Sqlist L){ if(L.length==0){ printf("当前顺序表为空\n"); return; } printf("当前顺序表元素为:"); for(int i=0;i<L.length;i++) printf("%d ",L.data[i]); printf("\n"); return; } int main(){ Sqlist T; ElemType e,x; int a,i; InitList(T); ListLoad(T); while(1){ printf("1:插入元素到指定位置\n"); //ListInsert printf("2:删除指定位置元素\n"); //ListDelete printf("3:找到指定元素的位置\n"); //LocateElem printf("请选择:"); scanf("%d",&a); switch(a){ case 1:scanf("%d %d",&i,&x); if(ListInsert(T,i,x))printf("元素%d成功插入%d位置\n",x,i); else printf("插入失败\n"); break; case 2:scanf("%d",&i); if(ListDelete(T,i,e))printf("成功删除%d位置元素,该元素为%d\n",i,e); else printf("删除失败\n"); break; case 3:scanf("%d",&e); if(!LocateElem(T,e))printf("未找到该元素\n"); else printf("该元素位于%d\n",LocateElem(T,e)); break; default:return 1; } ListLoad(T); } }
插入元素ListInsert:
删除元素(ListDelete):
查找指定元素的位置(LocateElem)