当前位置: 首页 > news >正文

C语言之链表增删查改

1.知识百科

  链表(Linked List)是计算机科学中一种基础的数据结构,通过节点(Node)的链式连接来存储数据。每个节点包含两部分:存储数据的元素和指向下一个节点的指针(单链表)或前后两个指针(双链表)。

  • 常见操作
      插入:在头部、尾部或指定位置插入节点。
      删除:删除指定节点(需处理指针指向)。
      遍历:从头节点依次访问每个节点。
      查找:按值或位置查找节点(需遍历)。

2.链表操作

2.1 创建链表

  创建一个链表,用于保存学生信息,分别存储姓名、学号和成绩。
在这里插入图片描述

typedef struct STU{
	char name[50];
	char id[20];
	float score;
	struct STU *next;
}STU_INFO,*P_STU; 

  添加节点,每一个节点保存一位学生信息。

/*录入信息*/
void STU_Input(P_STU node)
{
	printf("请输入姓名、学号、成绩:\n");
	scanf("%s%s%f",node->name,node->id,&node->score);
	while(getchar()!='\n');
}
/*
添加节点(尾插法)
*/
void STU_AddNode(P_STU *head)
{
	if(*head==NULL)
	{
		*head=malloc(sizeof(STU_INFO));//创建链表头
		(*head)->next=NULL;
		STU_Input(*head);//录入成员信息
		return ;
	}
	//链表头已存在
	P_STU phead=*head;
	//偏移指针,将phead指向链表尾
	while(phead->next!=NULL)
	{
		phead=phead->next;
	}
	//创建节点
	P_STU new_node=malloc(sizeof(STU_INFO));
	printf("添加节点:%p\n",new_node);
	phead->next=new_node;
	phead=phead->next;
	phead->next=NULL;//new_node->next=NULL;
	//录入信息
	STU_Input(new_node);//录入成员信息
}

2.2 遍历链表

  遍历链表,查看所有学生信息。

void STU_Output(P_STU head)
{
	P_STU phead=head;//指向链表头
	while(phead!=NULL)
	{
		printf("姓名:%s  学号:%s  成绩:%.1f\n",phead->name,phead->id,phead->score);
		phead=phead->next;
	}
}

2.3 删除节点

  根据名字查找子节点,并删除。

  当删除的节点为中间节点,删除过程如下:
在这里插入图片描述
  当删除的节点为头节点,删除过程如下:
在这里插入图片描述
  节点删除代码实现如下,支持删除多个连续的重复节点。

//查找子节点进行删除
P_STU STU_FindNode_Del(P_STU head)
{
	//判断链表头是否为NULL
	P_STU phead=head;
	P_STU temp=head,temp2;
	char name[50];
	printf("请输入要查找的名字:\n");
	scanf("%s",name);
	while(getchar()!='\n');
	while(phead!=NULL)
	{
		if(strcmp(phead->name,name)==0)
		{
			//要删除的数据在链表头
			if(phead==head)
			{
				temp=phead;
				phead=phead->next;
				free(temp);
				head=phead;
			}
			else{
				//要删除的数据不在链表头
				temp->next=phead->next;
				temp2=phead;
				phead=phead->next;
				free(temp2);//释放节点
			}
		}
		else //继续找下一个成员
		{
			temp=phead;
			phead=phead->next;//继续查找下一个成员
		}
	}
	return head;//返回链表头
}

  测试示例:

int main()
{
	P_STU head=NULL;//定义一个结构体指针
	int i=0;
	//添加节点
	while(1)
	{
		STU_AddNode(&head);
		i++;
		if(i>=4)break;
	}
	printf("遍历链表\n");
	STU_Output(head);
	printf("删除节点\n");
	head=STU_FindNode_Del(head);
	printf("剩余成员信息\n");
	STU_Output(head);
	return 0;
}

  运行效果:

wbyq@wbyq-virtual-machine $ ./a.out 
请输入姓名、学号、成绩:
1 1 1
请输入姓名、学号、成绩:
2 2 2
请输入姓名、学号、成绩:
2 2 2
请输入姓名、学号、成绩:
3 3 3
遍历链表
姓名:1  学号:1  成绩:1.0
姓名:2  学号:2  成绩:2.0
姓名:2  学号:2  成绩:2.0
姓名:3  学号:3  成绩:3.0
删除节点
请输入要查找的名字:
2
剩余成员信息
姓名:1  学号:1  成绩:1.0
姓名:3  学号:3  成绩:3.0

http://www.dtcms.com/a/99484.html

相关文章:

  • 【Java SE】Java比较器:Comparable、Comparator
  • Python的ASGI Web 服务器之uvicorn
  • 图解AUTOSAR_SWS_SynchronizedTimeBaseManager
  • Vue——常用指令总结、指令修饰符、v-model原理、computed计算属性、watch监听器、ref和$refs
  • JAVA反序列化深入学习(八):CommonsCollections6
  • python 上下文管理器with
  • CKS认证 | Day3 K8s容器运行环境安全加固
  • 实战篇Redis
  • 动力电池热失控:新能源汽车安全的“隐形火山”如何预防?
  • 蓝桥杯 之 二分
  • 8、linux c 信号机制
  • sass报错,忽略 Sass 弃用警告,降级版本
  • 笔记本裸机安装centos,找不到wifi设备问题
  • 英语学习笔记1
  • 命悬生死线:当游戏遭遇DDoS围剿,如何用AI破局?
  • 【Linux网络与网络编程】01.初识网络
  • 【设计模式】状态模式
  • Redis 分布式锁实现深度解析
  • RHCA核心课程技术解析5:红帽高可用性集群架构与深度实践
  • 基于Huggingface的lerobot项目在so-arm100机械臂上的复现笔记
  • 创建SpringBoot项目报错
  • Java创建对象有几种方式?
  • 吴恩达深度学习复盘(1)神经网络与深度学习的发展
  • 什么是UI自动化测试?什么项目适合做UI自动化测试?
  • 编程考古-Borland JBuilder:一场关于Java灵魂的战争与救赎
  • Android 设计模式之适配器模式
  • 智能路由系统-信息泄露漏洞挖掘
  • 简单使用LlamaIndex实现RAG
  • (四)GTM_TOM模块定时器中断应用
  • 基于Python深度学习的鲨鱼识别分类系统