文章目录
- 0 背景
- 1 创建链表操作
- 1.1 头插法
- 1.2 尾插法
- 2 删除元素
- 3 完整示例
0 背景
一般使用单链表多使用带头节点的单链表,好处是:
- 1 对表首操作和在表的其他位置的操作一致,无需特殊处理;
- 2 判链表是否为空时,头指针都是指向头节点的非空指针,空表和非空表的处理也得到统一。【如果不带头节点时,空链表的头指针为NULL】
1 创建链表操作
存储结构定义:
typedef struct LNode{
int data;//数据
struct LNode* next;//指针域
}LNode;
1.1 头插法
//头插法
LNode* List_Head(LNode* &L, int x){
LNode* s;
s = (LNode*) malloc(sizeof(LNode));
s->data = x;
s->next = L;
L = s;//把新节点的地址赋给头指针
return s;
}
//创建头指针
LNode* L = (LNode*)malloc(sizeof(LNode));
/*
* 头插法
*/
//第一个数据赋值
L->data = 2;
L->next = NULL;
//
1.2 尾插法
//尾插法
LNode* List_Tail(LNode* &r, int x){
LNode *s;
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
r->next = NULL;
return r;
}
//创建头指针
LNode* L = (LNode*)malloc(sizeof(LNode));
/*
* 尾插法
*/
//第一个数据赋值
L->data = 2;
L->next = NULL;
LNode* r = L;//表尾指针
2 删除元素
//删除值为x的节点,L为头指针
void List_Erase(LNode* &L, int x){
LNode* p;
if(L == NULL) return;
if(L->data == x){
p = L;
L = L->next;
/*
使原本指向当前结点的指针指向下一个结点【等价于L->next = L->next->next】,
因此下面的语言不会断链
*/
free(p);
List_Erase(L, x);
}else{
List_Erase(L->next, x);
}
}
3 完整示例
typedef struct LNode{
int data;//数据
struct LNode* next;//指针域
}LNode;
//尾插法
LNode* List_Tail(LNode* &r, int x){
LNode *s;
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
r->next = NULL;
return r;
}
//头插法
LNode* List_Head(LNode* &L, int x){
LNode* s;
s = (LNode*) malloc(sizeof(LNode));
s->data = x;
s->next = L;
L = s;
return s;
}
//删除值为x的节点
void List_Erase(LNode* &L, int x){
LNode* p;
if(L == NULL) return;
if(L->data == x){
p = L;
L = L->next;
free(p);
List_Erase(L, x);
}else{
List_Erase(L->next, x);
}
}
int main(){
//创建头指针
LNode* L = (LNode*)malloc(sizeof(LNode));
/*
* 头插法
*/
L->data = 2;
L->next = NULL;
List_Head(L, 5);
List_Head(L, 2);
List_Head(L, 4);
List_Head(L, 3);
List_Head(L, 2);
List_Head(L, 1);
List_Head(L, 2);
/*
* 尾插法
*/
// L->data = 2;
// L->next = NULL;
// LNode* r = L;//表尾指针
// List_Tail(r, 1);
// List_Tail(r, 2);
// List_Tail(r, 3);
// List_Tail(r, 4);
// List_Tail(r, 2);
// List_Tail(r, 5);
// List_Tail(r, 2);
//判空链表
// L->data = 2;
//L->next = NULL;
/*
* 删除元素值为2
*/
List_Erase(L, 2);
/*
* 打印链表
*/
while(L != NULL){
printf("%d ", L->data);
L = L->next;
}
return 0;
}
结果: