线性表
最常用且最简单的一种数据结构
一个线性表是n个数据元素的有限序列
一个数据元素可以由若干数据项组成,这种情况下,常把数据元素称为记录,含有大量记录的线性表又称为文件
抽象数据类型
1 | ADT List{ |
线性表的存储表示
1.线性表的动态分配顺序存储结构
1 |
|
图示
插入:平均移动节点次数为n/2;
删除:平均移动节点次数为(n-1)/2;
2.线性表的静态单链表存储结构
1 |
|
图示
3.线性表的链式存储结构
1 | typedef LNode{ |
不带头结点的空表判定:L==NULL
带头结点的空表判定:L->next=NULL
循环单链表为空的判定:L.next=L
线性链表的最后一个结点的指针为:NULL
头结点的数据域为空,指针域指向第一个元素
a.单向链表
图示
头结点的作用:对开始节点的操作,插入删除无需特殊处理,统一了空表和非空表
建立单链表
①头插法:s->next=head->next; head->next=s; 生成的顺序与输入顺序相反。平均时间复杂度O(n)
②尾插法:s->next=head->next; head->next=s; head=s;生成的顺序与输入顺序相同。平均时间复杂度为O(n)
*查找*:与查找位置有关,平均时间复杂度均为O(n)
*插入运算*:p=GetNode(L, i-1); s->next=p->next; p->next=s; 平均时间复杂度O(n)
*删除运算*:p=GetNode(L, i-1); s=p->next; p->next=s->next; free(s); 平均时间复杂度O(n)
b.单向循环链表
图示
c.双向链表
1 | typedef struct DuLNode{ |
图示
1 | typedef struct{ //链表类型 |
顺序表和单链表的比较
顺序表
优点:
存储密度大,可随机存储
缺点:
①大小固定;
②不利于增减节点;
③存储空间不能充分利用;
④容量难扩充;
链式存储
优点:
①易于插入删除;
②可动态申请空间;
③表容量仅受内存空间限制;
缺点:
①增加了存储空间的开销;
②不可以随机存储元素;
顺序表代码
1 |
|
单链表代码
1 |
|
双向链表代码
1 |
|