1:此次学习参考的是b站up主【【一听就懂】C语言单链表(合集)!学完C语言还没学会写单链表吗?一节课教你有头单链表的全部知识!】https://www.bilibili.com/video/BV1Mm4y1V7Ww?vd_source=fa5bfcb2d5af224272cc17f6b40b10c3
易错点
2.1 在 creatlist 和 creatNode 函数中,如果 malloc 分配内存失败,程序会打印错误信息并返回 NULL 。这是正确的处理方式,但实际使用中可能需要更详细的错误处理。
2.2
在 push_back_student 和 ins_pos 函数中,如果链表为空(即 list 为 NULL ),这些函数的行为可能不正确。特别是在 push_back_student 中,如果链表为空, curnode 将是一个空指针,导致程序崩溃。
2.3
在 ins_pos 函数中,如果 pos 大于链表长度,插入操作可能会在链表尾部之后进行,这可能不是预期的行为。
2.4
在 find 函数中,如果找到了匹配的值,返回节点指针;如果未找到,返回 NULL 。调用者需要正确处理这两种情况。
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
typedef int Data;
typedef struct Student {
Data data;
struct Student *next;
}Student;
// 创建链表头节点
Student* creatlist() {
Student* head = malloc(sizeof(Student)); // 分配内存空间给头节点
if (!head) { // 如果内存分配失败
printf("creat head with failed"); // 打印错误信息
return NULL; // 返回 NULL
}
memset(head,0,sizeof(Student)); // 将头节点初始化为0
return head; // 返回头节点
}
// 创建新节点
Student* creatNode(Data val) {
Student* node=malloc(sizeof(Student)); // 分配内存空间给新节点
if (!node) { // 如果内存分配失败
printf("creat with failed"); // 打印错误信息
return NULL; // 返回 NULL
}
node->data=val; // 设置新节点的数据
node->next=NULL; // 新节点的下一个节点指针初始化为NULL
return node; // 返回新节点
}
// 头插入法
void push_front_student(Student* list,Data val) {
Student* newnode = creatNode(val); // 创建一个新节点
newnode->next = list->next; // 新节点的下一个节点是当前头节点的下一个节点
list->next = newnode; // 头节点的下一个节点变为新节点,完成插入
}
// 尾插入法
void push_back_student(Student *list,Data val) {
Student* curnode = list; // 从头节点开始遍历
while (curnode->next) { // 遍历到链表的末尾
curnode = curnode->next;
}
Student* newnode = creatNode(val); // 创建新节点
curnode->next = newnode; // 将新节点插入到链表末尾
}
// 指定位置插入
void ins_pos(Student* list,int pos,Data data) {
Student* curnode = list; // 从头节点开始遍历
for (int i=0; i<pos && curnode->next; i++) { // 遍历到指定位置的前一个节点
curnode = curnode->next;
}
Student* newnode = creatNode(data); // 创建新节点
newnode->next = curnode->next; // 新节点的下一个节点是当前节点的下一个节点
curnode->next = newnode; // 将新节点插入到当前节点之后
}
// 在指定节点后插入
void ins_item(Student* list,Student* item,Data val) {
Student* newnode = creatNode(val); // 创建新节点
newnode->next = item->next; // 新节点的下一个节点是指定节点的下一个节点
item->next = newnode; // 将新节点插入到指定节点之后
}
// 查找指定值的节点
Student* find(Student* list,Data val) {
Student* curnode = list->next; // 从头节点的下一个节点开始遍历,因为头节点通常不存储数据
while (curnode) { // 遍历链表直到末尾
if (curnode->data == val) { // 如果找到匹配的值
return curnode; // 返回节点指针
}
curnode = curnode->next; // 移动到下一个节点
}
return NULL; // 如果未找到,返回 NULL
}
// 打印链表
void showList(Student* head) {
Student* current = head->next; // 从头节点的下一个节点开始遍历,因为头节点通常不存储数据
while (current != NULL) { // 遍历链表直到末尾
printf("%d -> ", current->data); // 打印当前节点的数据
current = current->next; // 移动到下一个节点
}
printf("NULL\n"); // 表示链表结束
}
// 主函数
int main() {
Student* list = creatlist(); // 初始化链表头节点
push_back_student(list,1); // 尾插入数据1
push_back_student(list,2); // 尾插入数据2
push_back_student(list,3); // 尾插入数据3
push_back_student(list,4); // 尾插入数据4
showList(list); // 打印链表
ins_pos(list,0,99); // 在位置0插入数据99
ins_pos(list,2,100); // 在位置2插入数据100
ins_pos(list,3,93); // 在位置3插入数据93
showList(list); // 打印链表
Student* item = find(list,93); // 查找值为93的节点
if (item) { // 如果找到节点
ins_item(list,item,9999); // 在该节点后插入数据9999
}
showList(list); // 打印链表
return 0; // 程序结束
}
标签:单链,curnode,创建,list,next,链表,插入,Student,节点
From: https://blog.csdn.net/mbvcxg/article/details/144792700