一,链表的定义与分类
二,单链表的插入删除
三,双向链表的插入与删除
一,链表的定义与分类
顺序存储表在进行操作的时候特别费时间
为了改变这一缺点,引入了链式存储
单链表:
单链表的逻辑次序和物理次序不一定一致 链表用一组任意的存储单元来放线性表的结点 存储单元可以连续也可非连续
每个线性链表的结点只有一个next指针域,所以为单链表
二,单链表的插入与删除
插入:
在带头结点的单链表L中第i个位置前插入一个元素的过程分为三部分
1,查找:
在单链表中找到第i-1个结点并由指针pre提示
2,申请:
申请新结点s,将数据域的值置为e
3,插入挂链:
通过修改指针域将新结点s挂入单链表L
主要代码如下:
s = (Node *) malloc(sizeof(Node)) /申请一个新结点/
s - > data = e
s - >next = pre - > next /修改指针,完成插入操作/
pre - > next = s
删除:
比如要删除第i个结点,过程分为两步:
1,查找 通过计数方式找到第i-1个结点并由指针pre指示
2,删除 删除第i个结点并释放结点空间 主要
代码如下:
r = pre -> next
pre -> next= pre-> next -> next
free(r)
三,双向链表的插入与删除
为了让查找删除等操作的时间变得更短,引入了双向链表
每个结点不仅有后继指针,还有前驱指针,为某些运算提供了很大的便利
结构定义如下:
typedef struct DNode
{ ElemType data ;
struct DNode * prior, *next;
}DNode , * DoubleList;
插入:
主要算法如下:
t->prior=p;
t->next=p->next;
p->next->prior=t;
p->next=t;
删除:
主要算法如下:
p->prior->next=p->next; //p前驱结点的后链指向p的后继结点
p->next->prior=p->prior; //p后继节点的前链指向p的前驱结点
free(p) ; //释放*p的空间
"前两行的语句可以颠倒"