顺序表和链表的比较
1.存取方式
顺序表可以随机访问,而链表只能从表头顺序查找。(因此经常查找顺序表某一个元素时,顺序表更适合)
2.逻辑结构与物理结构
顺序表中,逻辑上相邻的元素,其物理存储位置也相邻。链表中,逻辑相邻的元素,其物理存储位置不相邻。
3.查找、插入和删除操作
按值查找时,顺序表链表时间复杂度都为O(n)。
按序号查找时,顺序表时间复杂度为O(1),而链表时间复杂度为O(n)。
插入和删除元素中,顺序表平均移动半个表的长度,而链表只需要改变一下指针域的值就可以了。
(因此,当线性表经常进行插入和删除元素时,选链表更合适)
4.空间分配
顺序表在静态存储分配的情形下,存储空间装满了就不能扩充;链表就不存在这个问题。
顺序表结构
#define MaxSize 50 //顺序表的最大长度 typedef char ElemType; //ElemType为数据类型 typedef struct //顺序表的静态表示 { ElemType data[MaxSize]; int length; }SqList;
顺序表的初始化
SqList CreateList() //初始化顺序表 { SqList L; L.length=0; //初始化要将顺序表的长度初始化为0 return L; }
向顺序表插入元素
bool InsertList(SqList &L,int i,ElemType d){ //插入元素 if(i<1||i>L.length+1||i>MaxSize) //将数据插入在第i个位置 { //插入的位置错误,返回false return false; } for(int j=L.length;j>=i;j--) //从后往前,将下标i-1及以后的元素向后移一个位置,为插入的元素腾位置 { L.data[j]=L.data[j-1]; //插入元素是向后移动 } L.data[i-1]=d; //低昂待插入的元素放的要插入的位置 L.length++; //插入完成后,长度加1 return true; //操作成功返回true }
删除顺序表中的元素
bool DeleteList(SqList &L,int i,ElemType &e){ //删除顺序表中的元素 if(i<1||i>L.length){ return true; //下标错误时,返回false } e=L.data[i-1]; //返回待删除的数据 for(int j=i;j<L.length;j++){ //从第i个开始向后 L.data[j-1]=L.data[j]; } L.length--; //删除后长度减短 return true; //操作完成,返回true }
查找顺序表中的元素
int FindList(SqList &L,ElemType e){ //返回第一个与e相等的元素的次序号,找不到返回0 for(int i=1;i<=L.length;i++){ if(L.data[i-1]==e){ //判断第i个元素是否等于e return i; //等于则返回位置 } } return 0; //遍历完顺序表还找不到 返回0 }
显示表内元素
void PrintList(SqList &L){ for(int i=0;i<L.length;i++) { cout<<L.data[i]<<' '; } }