单链表基本操作(保姆级教程)c语⾔
单链表定义:
1、表中的数据是以结点来表⽰的,每个结点的构成:元素(数据元素的映象) + 指针(指⽰后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。
2、链表的结点结构
┌───┬───┐
│data│next│
└───┴───┘
data域–存放结点值的数据域
next域–存放结点的直接后继的地址(位置)的指针域(链域)。
单链表的基本操作:
1.头⽂件数据类型准备
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<malloc.h>
#include<string.h>
//链表结点个数
int length =0;
//定义结点
struct Node
{
char student[10];//为了⽅便测试数据域中放⼊学⽣的姓名
Node* next;//指针域
}
2.单链表的初始化
struct Node*createList()
{
struct Node* headNode =(struct Node*)malloc(sizeof(struct Node));//为头结点分配⼀块内存空间
headNode->next = nullptr;//初始化头结点
return headNode;
}
headNode->next = nullptr;
有很多初学的⼩伙伴就会问了为什么要让头结点的指针域指向空指针?
因为在初始化指针的时候,如果指针没有指向的内容,就要让他指向空指针,否则就产⽣“野指针”。
3.单链表的显⽰
struct Node* move = head;
while(move->next)//当move不为最后⼀个结点时,继续向下遍历
{
move = move->next;
printf("%s", move->student);
printf("\n");
}
}
4.单链表头插法
void head_insert(struct Node* head)
{
struct Node *newNode=(struct Node*)malloc(sizeof(struct Node));//为新结点开辟内存空间
char student1[10];
scanf("%s", student1);//插⼊的学⽣姓名
newNode->next = head->next;
head->next = newNode;
newNode->next = nullptr;
strcpy(newNode->student, student1);
length++;//结点数量+1
}
⼩伙伴们看到这三⾏代码是可能有点懵
但是不要紧,画个图就好了
newNode->next = head->next;
head->next = newNode;
newNode->next = nullptr;
按照链表的逻辑来看
新结点的指针应该指向头结点所指向的结点 。 对应的代码就是newNode->next = head->next;
头结点的指针应该指向新结点。 对应的代码就是第⼆句head->next = newNode
最后让新结点的指针指向空指针newNode->next = nullptr;
注意了家⼈们前两句代码的顺序不能调换!!!
来分析⼀下为什么不能调换
head->next = newNode;
newNode->next = head->next;
第⼀步执⾏完head->next = newNode;头结点的指向就已经是新结点了,⽽原来头结点所指向的结点内容就不到了,所以肯定是不⾏的5.单链表的插⼊⽅法
int a =0;
char student1[10];
struct Node* move = head;
struct Node* newNode =(struct Node*)malloc(sizeof(struct Node));
printf_List(head);
printf("请输⼊你要插⼊的位置");
scanf("%d",&a);
for(int i =0; i < a; i++)
{
move = move->next;
}
newNode->next = move->next;
move->next = newNode;
printf("请输⼊你要插⼊的内容");
scanf("%s", student1);
strcpy(newNode->student, student1);
length++;
}
使⽤for循环移动指针到要插⼊的位置
指针的指向部分与头插法相似,请⼤家开动脑筋⾃⼰思考思考(太懒了不想写了)
6.单链表的删除
void delete_(struct Node* head)
{
char student1[10];
struct Node* move = head;
printf("请输⼊你要删除的数据");
scanf("%s", student1);
while(move->next)
{
if(0==strcmp(move->next->student, student1))//如果⼆个字符串相等返回0
{
Node* temp = move->next;
move->next = move->next->next;
free(temp);
length--;
return;
}
move=move->next;
}
printf("没有到该数据");
}
分析⼀下
while循环中的⼏句代码
上图
Node* temp = move->next;先将要删除的结点地址⽤temp保存下来。
move->next = move->next->next;使被删除结点上⼀个结点指向被删除结点的下⼀个结点(说的反⽽不清楚了,看图理解吧)free(temp);最后将被删除结点的地址释放掉。
7.代码测试
int main()
{
Node* List;
List =createList();
head_insert(List);
insert(List);
printf_List(List);
delete_(List);
printf_List(List);
return0;
}
最后附上源码
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<malloc.h>
#include<string.h>
int length =0;
struct Node
{
char student[10];
Node* next;
};
struct Node*createList()
{
struct Node* headNode =(struct Node*)malloc(sizeof(struct Node)); headNode->next = nullptr;
return headNode;
}
void printf_List(struct Node* head)
{
printf("学⽣信息:\n");
struct Node* move = head;
while(move->next)
{
move = move->next;
printf("%s", move->student);
printf("%s", move->student);
printf("\n");
}
}
void head_insert(struct Node* head)
{
char student1[10];
printf("请输⼊你要插⼊的内容\n");
scanf("%s", student1);
struct Node *newNode=(struct Node*)malloc(sizeof(struct Node)); newNode->next = head->next;
head->next = newNode;
strcpy(newNode->student, student1);
newNode->next = nullptr;
length++;
c语言struct头文件}
void insert(struct Node* head)
{
int a =0;
char student1[10];
struct Node* move = head;
struct Node* newNode =(struct Node*)malloc(sizeof(struct Node));
printf_List(head);
printf("请输⼊你要插⼊的位置\n");
scanf("%d",&a);
for(int i =0; i < a; i++)
{
move = move->next;
}
newNode->next = move->next;
move->next = newNode;
printf("请输⼊你要插⼊的内容\n");
scanf("%s", student1);
strcpy(newNode->student, student1);
length++;
}
void delete_(struct Node* head)
{
char student1[10];
struct Node* move = head;
printf("请输⼊你要删除的数据\n");
scanf("%s", student1);
while(move->next)
{
if(0==strcmp(move->next->student, student1))
{
Node* temp = move->next;
move->next = move->next->next;
free(temp);
length--;
return;
}
move=move->next;
}
printf("没有到该数据\n");
}
int main()

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。