提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
线性表可以用顺序表或链表存储
两种存储表示各有哪些主要优缺点?
一、线性表是什么?
线性表存在唯一的一个称作“第一个”的元素;
存在唯一的一个称作“最后一个”的元素;
除第一个元素外,集合中的每一个元素均只有一个直接前趋;
除最后一个元素外,集合中的每个元素均只有一个直接后趋。
二、顺序表和链表
1.顺序表
代码如下(示例):
#define maxSize 100
typedef int DataType;
typedef struct{
DataType data[maxSize];
int n;
}SeqList;
2.顺序表的插入与删除
插入数据
删除数据
3.链表(单链表)
代码如下(示例):
typedef int DataType;
typedef struct node{
DataType data;
struct node* link;
}LinkNode,*LinkList;
4.链表的插入与删除
代码如下(示例):
插入数据
int Insert(LinkNode* L,int k,int elem){
LinkNode* p,*q;
if(k==1) p=L; //元素elem插入在第一个元素位置
else p=Locate(L,k-1); //查找表中的第k-1个元素
if(p==NULL) return 0; //表中不存在第k-1个元素,插入失败
q=new LinkNode; //创建插入结点
if(q==NULL) return 0;
q->data=elem;
q->link=p->link;
p->link=q; //元素elem插入第k-1个元素之后
return 1;
}
删除数据
int Remove(LinkNode* L,int k){
LinkNode* p,*q;
if(k==1) p=L; //删除第一个元素结点
else p=Locate(L,k-1); //查找表中的第k-1个元素
if(p==NULL) return 0; //表中不存在第k-1个元素,插入失败
q=p->link; //令q指向第k个元素结点
p->link=q->link;
free(q); //删除结点
q=NULL;
return 1;
}
总结
两种存储表示的优缺点:
顺序表的优点:
1.从时间上讲,它不但可以顺序存取,还可以直接存取,访问速度快;
2.从空间上讲,它的存储利用率高,不需要指针。
顺序表缺点:
1.从时间上讲,顺序表在插入或删除时,如果需要保持原来的顺序,必须移动平均一半的元素,因此更新速度慢;
2.从空间上讲,如果采用静态分配的存储结构,一旦存储数组的空间已满,不能扩充,再插入新元素将导致溢出。
链表的优点:
1.从时间上讲,插入或删除操作不需要大量移动元素,只需要修改指针,更新速度快;
2.从空间上讲,链表基本没有满和溢出的问题,只要内存可以分配结点,就可以扩充。
链表的缺点:
1.从时间上讲,链表只能顺序访问,所以查找一个元素平均要搜索半个表,访问速度慢;
2.从空间上讲,每个元素需附加一个指针,存储利用率较低;
此外,链表的单线联系的特性,如果操作不当,导致断链,将会丢失后面的所有的数据。