单向链表

阅读量: 176 编辑

数据元素之间的关系在计算机中有两种不同的表示方法:顺序存储结构和链式存储结构。 链表存储元素的地址可以是不连续的。

在使用链表结构表示数据元素 a 时,除了存储 a 本身的信息之外,还需要一个存储指示其后继元素的存储位置,这两个部分组成了 a 的存储映像,通常称为结点(Node)。

struct Node{
    char data;
    Node *next;
}; 

其中,data 域为数据域,用来存储结点的值;next 城为指针域,用来存储结点的直接后继的存储地址。n 个结点组成了一个链表,即线性表的链式存储结构。

1581578151002144.png

A 结点叫做head,链表的头结点;

B 被称为 A 的后继结点,A被称为 B的前驱结点,其他依次类推;

一、遍历结点

从链表头开始,依次向后遍历(查找)即可。

1581578312482848.png

Node *cur = &A; //头结点开始
while(cur) {
	print(cur->data);
	cur = cur->next;//依次向后
}

二、插入结点

给定一个链表:在位置 i 的后面插入一个值为 data 的结点(或者在指定的结点后面插入),如在A的结点后面插入结点E:

1581578488643616.png

  • 创建E结点

  • E->next = A->next;

  • A->next = E

Node E = {'E'};
Node *pa=&A, *pe=&E;
pe->next = pa->next;
pa->next = pe;

位置 i 根据遍历结点找到对应的 *p 就可以插入结点到其后面了。

//找到结点后插入
Node *cur = &A; //头结点开始
while(cur) {
	cur = cur->next;//依次向后
    if(cur->data == 'B')break;
}
pe->next = cur->next;
cur->next = pe;

三、删除结点

一个链表 i 位置 (i >= 1) 的结点删除并且返回被删除的结点的值(或者在指定的结点后面删除)。由于第 0 个结点是头结点所以不能删除,比如删除B结点。

1581578803216416.png

  • Node *del = A->next;

  • A->next= del->next;// A->next->next

  • free(del);

Node *p = &A;
Node *del = p->next;
p->next = del->next; //p->next = p->next->next
print(del->data);
//free(del);
爱码岛编程公众号
试卷资料
爱码岛编程小程序
在线刷题
苏ICP备13052010号
©2023 南京匠成信息科技有限公司