单链表定义:
1、表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。
2、链表的结点结构
┌───┬───┐
│data│next│
└───┴───┘
data域–存放结点值的数据域
next域–存放结点的直接后继的地址(位置)的指针域(链域)。
单链表的基本操作:
1.头文件 数据类型准备
2.单链表的初始化
3.单链表的显示
4.单链表的头插法
5.单链表的插入方法
6.单链表的删除
7.单链表的测试
8.源码
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.单链表的显示
void printf_List(struct Node* head)
{
struct Node* move = head;
while (move->next)
{
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++;
}
小伙伴们看到这三行代码是可能有点懵 但是不要紧,画个图就好了 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.单链表的插入方法
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("请输入你要插入的位置");
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))
{
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);
return 0;
}
最后附上源码
#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("\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++;
}
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()
{
Node* List;
List = createList();
head_insert(List);
insert(List);
printf_List(List);
delete_(List);
printf_List(List);
return 0;
}
喜欢的家人们给个三连 !!!!
|