编译器是VS2019 基本上都有注释,需要学习的同学可以在编译器中进行调试,根据每一行进行的数据变化来对链表进行加深理解和学习。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>
typedef struct MyList
{
int num; //数据域 若有其他数据继续添加就是了
MyList* next; //指针域
}MyList;
//初始化链表,对链表插入原始数据
void Init_MyList(MyList* head)
{
MyList* myList = head;
for (size_t i = 0; i < 20; i++)
{
myList->next = (MyList*)malloc(sizeof(MyList));
myList = myList->next;
myList->num = i;
}
myList->next = NULL;
myList = head;
}
//显示链表所有结点数据
void MyList_Show(MyList* head)
{
MyList* myList = head;
while (myList->next != NULL)
{
myList = myList->next;
printf("%d,", myList->num);
}
printf("\n");
}
//寻找某一个结点
void MyList_Find(MyList* head, int goal)
{
MyList* myList = head;
while (myList->next != NULL)
{
if (myList->next->num == goal)
{
printf("查到了!!!数值为%d\n", myList->next->num);
break;
}
myList = myList->next;
}
}
//修改结点数据
void MyList_Modify(MyList* head, int goal, int newValue)
{
MyList* myList = head;
while (myList->next != NULL)
{
if (myList->next->num == goal)
{
myList->next->num = newValue;
break;
}
myList = myList->next;
}
}
//删除结点
void MyList_Remove(MyList* head, int goal)
{
MyList* myList = head;
MyList* delNode = NULL;
while (myList->next != NULL)
{
if (myList->next->num == goal)
{
delNode = myList->next;
//将要删除结点的前后节点相连
myList->next = myList->next->next;
free(delNode);
break;
}
myList = myList->next;
}
}
//后插法,在指定的节点后插入新的节点
void MyList_Add_Follow(MyList* head, int goal, MyList* insert)
{
MyList* myList = head;
//存放指定结点后一个结点
MyList* tmp1 = (MyList*)malloc(sizeof(MyList));
while (myList->next != NULL)
{
if (myList->next->num == goal)
{
//当后插位置为链表末尾,直接新增结点
if (myList->next->next == NULL)
{
myList->next->next = (MyList*)malloc(sizeof(MyList));
myList->next->next = insert;
insert->next = NULL;
}
else
{
tmp1 = myList->next->next;
myList->next->next = insert;
insert->next = tmp1;
}
break;
}
myList = myList->next;
}
}
//前插法,在指定的节点后插入新的节点
void MyList_Add_Ahead(MyList* head, int goal, MyList* insert)
{
MyList* myList = head;
//存放指定结点后一个结点
MyList* tmp1 = (MyList*)malloc(sizeof(MyList));
while (myList->next != NULL)
{
if (myList->next->num == goal)
{
tmp1 = myList->next;
myList->next = insert;
myList->next->next = tmp1;
break;
}
myList = myList->next;
}
}
int main()
{
MyList* myList = (MyList*)malloc(sizeof(MyList));
printf("/****************遍历结点*****************/\n");
Init_MyList(myList);
MyList_Show(myList);
printf("/*****************************************/\n\n");
printf("/*************前插法插入结点***************/\n");
//在2前面加个100
//要插入的结点
MyList* insert = (MyList*)malloc(sizeof(MyList));
//结点中存放的数据
insert->num = 100;
MyList_Add_Ahead(myList, 2, insert);
MyList_Show(myList);
printf("/*****************************************/\n\n");
printf("/*************后插法插入结点***************/\n");
//在2后面加个200
//要插入的结点
MyList* insert2 = (MyList*)malloc(sizeof(MyList));
//结点中存放的数据
insert2->num = 200;
MyList_Add_Follow(myList, 2, insert2);
MyList_Show(myList);
printf("/*****************************************/\n\n");
printf("/****************删除结点***************/\n");
//删除2这个结点
MyList_Remove(myList, 2);
MyList_Show(myList);
printf("/*****************************************/\n\n");
printf("/*************修改结点数据***************/\n");
//将3这个结点的数据3改为666
MyList_Modify(myList, 3, 666);
MyList_Show(myList);
printf("/*****************************************/\n\n");
printf("/*************查找结点数据***************/\n");
//查找18这个结点
MyList_Show(myList);
MyList_Find(myList, 18);
printf("/*****************************************/\n\n");
}
效果图:
C语言 链表(三) 项目实战:学生管理系统单链表和文件操作通用框架
有意➕wechat a923510073 QQ 923510073 欢迎咨询进行学习上的问题交流。