单向链表创建过程
链表的创建过程要特判链表的首部位置,对这个位置的操作要做一些特别的处理。
- 创建链表head节点
cpp
struct node *head = (struct node*)malloc(sizeof(struct node));
int x;
cin >> x;
head->data = x;
head->next = NULL;主要完成对head节点的创建以及初始化 2. 创建后续节点
cpp
while(i < n){
p = (struct node*)malloc(sizeof(struct node));
cin >> x;
p->data = x;
p->next = NULL;
if(head->next == NULL){
head->next = p;
}else{
tail->next = p;
}
tail = p;
i++;
}首先申请一片内存,操作这个内存里的node节点,初始化各个数据之后将节点插入到链表的尾部,这里需要判断是不是插入在head节点的后面,因为这个时候并没有更新tail节点为链表的尾部,所以要特判处理。最后更新tail节点为链表的尾部,计数变量自增,即可完成尾部节点的插入。 3. 返回创建的链表head节点的指针
cpp
return head;操作
查找等基本操作相当简单,这里不再提。
插入

cpp
list insert(element x,int i,list PtrL){
list p,s;
if(i == 1){//特判表头情况
申请内存
s->data = x.data;
s->next = Ptrl;
return s;
}
p = 插入位点
if(p = NULL) return NULL;
else{
分配内存
s->data = x.data;
s->next = p->next;
p->next = s;
}
}删除

- 找到删除节点的前一个节点,指针p指向这个节点
- 将指针s指向需要被删除的节点
- 将
p->next修改为s->next - 释放s的空间 如果删除的是头节点,如果链表为空,返回一个空指针,否则返回头节点的下一个节点。
广义表
为了表示二元多项式,可以在一元多项式的基础上将data指向另外一个存储一元多项式的链表:
广义表是线性表的推广。
构建
c
#include <stdio.h>
typedef struct GNode *GList;
struct GNode{
int tag;
union{
ElementType Data;
GList Sublist;
} URegion;
GList Next;
};多重链表
如果一个矩阵 中0元素非常多的话,称之为稀疏矩阵,如果用二维数组存的话会造成空间浪费。(反之,稠密的,例如这个稠密图[[2023.12.22-2023.12.29#^eae0c0]]) 这时候可以采取十字链表存储,每一个元素由其行列坐标及数值构成。
十字链表可以理解成为一个
将b,c图示结构利用union合并可以统一为a的形式存储。