数据元素之间的关系在计算机中有两种不同的表示方法:顺序存储结构和链式存储结构。 链表存储元素的地址可以是不连续的。
在使用链表结构表示数据元素 a 时,除了存储 a 本身的信息之外,还需要一个存储指示其后继元素的存储位置,这两个部分组成了 a 的存储映像,通常称为结点(Node)。
struct Node{
char data;
Node *next;
};
其中,data 域为数据域,用来存储结点的值;next 城为指针域,用来存储结点的直接后继的存储地址。n 个结点组成了一个链表,即线性表的链式存储结构。
A 结点叫做head
,链表的头结点;
B 被称为 A 的后继结点,A被称为 B的前驱结点,其他依次类推;
一、遍历结点
从链表头开始,依次向后遍历(查找)即可。
Node *cur = &A; //头结点开始
while(cur) {
print(cur->data);
cur = cur->next;//依次向后
}
二、插入结点
给定一个链表:在位置 i 的后面插入一个值为 data 的结点(或者在指定的结点后面插入),如在A的结点后面插入结点E:
-
创建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结点。
-
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);