删除一个节点,只需要将前向节点和后向节点接续即可;
插入一个节点,需要将前向节点和插入节点接续、插入节点和后向节点接续。
1.源程序
list.c
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int num;
char name[128];
struct node *next;
}Lnode;
//初始创建链表
Lnode* CreateList();
//打印链表中所有信息
void PrintList(Lnode* head);
//根据学号删除链表节点
Lnode* DeleteNode(Lnode* head);
//在某个学号后插入节点
void InsertNode(int num,Lnode* head);
//清除整个链表
void ClearList(Lnode** headptr);
int main()
{
Lnode* head = NULL;
int flag = -1;
do{
printf("###################################################\n");
printf("请输入:\n1——创建链表\n");
printf("2——打印链表\n");
printf("3——插入节点\n");
printf("4——删除节点\n");
printf("5——清除链表\n");
printf("0——退出程序\n");
printf("###################################################\n");
scanf("%d",&flag);
switch(flag){
case 0: break;
case 1:{
head = CreateList();
continue;
}
case 2:{
PrintList(head);
continue;
}
case 3:{
printf("请输入在哪个学号后插入:\n");
int num;
scanf("%d",&num);
InsertNode(num,head);
continue;
}
case 4:{
head = DeleteNode(head);
continue;
};
case 5:ClearList(&head);
}
}while(flag);
return 0;
}
void ClearList(Lnode** headptr)//指向指针的指针;改变头指针的值
{
Lnode* freenode;
freenode = *headptr;
while(freenode != NULL){
free(freenode);
freenode = freenode->next;
}
*headptr = NULL;
printf("链表清除成功!\n");
}
Lnode* DeleteNode(Lnode* head)
{
int num;
Lnode* forword = head;//注意:单向链表只有后继指针、没有前驱指针;因此、需要记录删除节点的前一个节点
Lnode* newhead = head;
printf("请输入需要删除学号:");
scanf("%d",&num);
if(head->num == num){
newhead = head->next;
free(head);
return newhead;
}
while((head->next != NULL) && (head->num != num)){
forword = head;
head = head->next;
}
if((head->next == NULL) && (head->num != num)) printf("链表中不存在这个节点!\n");
else{
printf("需要删除的学号是:%d,姓名是:%s\n",head->num,head->name);
forword->next = head->next;
free(head);
}
return newhead;
}
void InsertNode(int num,Lnode* head)
{
while((head->next != NULL) && (head->num != num)){
head = head->next;
}
if((head->next == NULL) && (head->num != num)) printf("链表中不存在这个节点!\n");
else{
Lnode* innode = (Lnode*)malloc(sizeof(Lnode));
printf("请输入学号:");
scanf("%d",&(innode->num));
if(innode->num == 0){
printf("学号不能为0!\n");
free(innode);
return;
}
printf("请输入姓名:");
scanf("%s",innode->name);
innode->next = head->next;
head->next = innode;
}
}
Lnode* CreateList()
{
Lnode* head = NULL;//创建链表时,头指针的值是返回值、不能改变
Lnode* innode = NULL;
Lnode* tail = NULL;//创建链表时,相当与从表尾插入
printf("请输入学号:");
innode = (Lnode*)malloc(sizeof(Lnode));
innode->next = NULL;
scanf("%d",&(innode->num));
printf("请输入姓名:");
scanf("%s",innode->name);
if(!(innode->num)){
free(innode);
return NULL;
}
do{
if(!head) head = innode;
else{
tail = innode;
printf("请输入学号:");
innode = (Lnode*)malloc(sizeof(Lnode));
innode->next = NULL;
tail->next = innode;
scanf("%d",&(innode->num));
if(innode->num == 0){
printf("学号不能为0!\n");
free(innode);
tail->next = NULL;
return head;
}
printf("请输入姓名:");
scanf("%s",innode->name);
}
}while(innode->num);
if(!(innode->num)){
free(innode);
tail->next = NULL;
}
return head;
}
void PrintList(Lnode* head)
{
int i = 1;
if(head == NULL){
printf("链表为空!\n");
return;
}
while(head){
printf("第%d个人学号是:%d,姓名是:%s\n",i,head->num,head->name);
head = head->next;
i++;
}
}
2.编译
gcc list.c -o list
3.运行
./list
###################################################
请输入:
1——创建链表
2——打印链表
3——插入节点
4——删除节点
5——清除链表
0——退出程序
###################################################
1
请输入学号:11
请输入姓名:张
请输入学号:13
请输入姓名:李
请输入学号:0
学号不能为0!
###################################################
请输入:
1——创建链表
2——打印链表
3——插入节点
4——删除节点
5——清除链表
0——退出程序
###################################################
2
第1个人学号是:11,姓名是:张
第2个人学号是:13,姓名是:李
###################################################
请输入:
1——创建链表
2——打印链表
3——插入节点
4——删除节点
5——清除链表
0——退出程序
###################################################
3
请输入在哪个学号后插入:
11
请输入学号:12
请输入姓名:王
###################################################
请输入:
1——创建链表
2——打印链表
3——插入节点
4——删除节点
5——清除链表
0——退出程序
###################################################
3
请输入在哪个学号后插入:
13
请输入学号:14
请输入姓名:李
###################################################
请输入:
1——创建链表
2——打印链表
3——插入节点
4——删除节点
5——清除链表
0——退出程序
###################################################
2
第1个人学号是:11,姓名是:张
第2个人学号是:12,姓名是:王
第3个人学号是:13,姓名是:李
第4个人学号是:14,姓名是:李
###################################################
请输入:
1——创建链表
2——打印链表
3——插入节点
4——删除节点
5——清除链表
0——退出程序
###################################################
4
请输入需要删除学号:12
需要删除的学号是:12,姓名是:王
###################################################
请输入:
1——创建链表
2——打印链表
3——插入节点
4——删除节点
5——清除链表
0——退出程序
###################################################
4
请输入需要删除学号:14
需要删除的学号是:14,姓名是:李
###################################################
请输入:
1——创建链表
2——打印链表
3——插入节点
4——删除节点
5——清除链表
0——退出程序
###################################################
2
第1个人学号是:11,姓名是:张
第2个人学号是:13,姓名是:李
###################################################
请输入:
1——创建链表
2——打印链表
3——插入节点
4——删除节点
5——清除链表
0——退出程序
###################################################
5
链表清除成功!
###################################################
请输入:
1——创建链表
2——打印链表
3——插入节点
4——删除节点
5——清除链表
0——退出程序
###################################################
2
链表为空!
###################################################
请输入:
1——创建链表
2——打印链表
3——插入节点
4——删除节点
5——清除链表
0——退出程序
###################################################
0