C语言 链表(二) 对链表进行增删改查的操作

编译器是VS2019 基本上都有注释,需要学习的同学可以在编译器中进行调试,根据每一行进行的数据变化来对链表进行加深理解和学习。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>

typedef struct MyList
{
	int num;      //数据域 若有其他数据继续添加就是了
	MyList* next; //指针域
}MyList;

//直接在链表后面添加数据
MyList** MyList_Add(MyList** move, int val)
{
	*move = (MyList*)malloc(sizeof(MyList));
	(*move)->num = val;
	(*move)->next = NULL;
	return &(*move)->next;
}

//初始化链表,对链表插入原始数据
void Init_MyList(MyList** move)
{
	for (size_t i = 0; i < 20; i++)
	{
		move=MyList_Add(move, i);
	}
}

//显示链表所有结点数据
void MyList_Show(MyList* head)
{
	while (head != NULL)
	{
		printf("%d,", head->num);
		head = head->next;
	}
	printf("\n");
}


//寻找某一个结点
void MyList_Find(MyList* head, int goal)
{
	MyList* myList = head;

	while (myList != 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 != 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 != 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!= 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 != NULL)
	{
		if (myList->next->num == goal)
		{
			tmp1 = myList->next;
			myList->next = insert;
			myList->next->next = tmp1;
			break;
		}
		myList = myList->next;
	}
}

int main()
{
	MyList* myList = NULL;
	MyList** move = &myList;

	printf("/****************遍历结点*****************/\n");
	Init_MyList(move);
	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");

}






效果图:

在这里插入图片描述
参数使用三级指针进行插入

//直接在链表后面添加数据
void MyList_Add(MyList*** move, int val)
{
	**move = (MyList*)malloc(sizeof(MyList));
	(**move)->num = val;
	(**move)->next = NULL;
	
	(*move)= &(**move)->next;
}

//初始化链表,对链表插入原始数据
void Init_MyList(MyList** move)
{
	for (size_t i = 0; i < 20; i++)
	{
		MyList_Add(&move, i);
	}
}

源码下载链接

C语言 链表(三) 项目实战:学生管理系统单链表和文件操作通用框架

有意➕wechat a923510073 QQ 923510073 欢迎咨询进行学习上的问题交流。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ou.cs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值