删除单链表中所有值为x的数据元素(C语言版)

article/2025/10/3 1:48:10

算法思路定义两个指针r与p,其中让p指针始终在r指针的前面,即p = r->next 。让两个指针在链表中从头结点开始移动,如果p指针所指向结点的数据域的值与给定的值x相等,就要删除 。因为指针r指向该结点的前驱结点,所以我们可以轻松的进行删除操作

void deletex (LinkList* head, int* x)
//head为头指针,LinkList为单链表的存储类型 
{LinkList*r;r = head; while (r->next != NULL)
//当指针r遍历整个链表后,退出while循环	{LinkList* p = r->next; if (p->data == (*x))	
//判断指针p所指向的节点的数据域的值是否与x相等		  {r->next = p->next;free (p);}
//如果相等,则删除该节点	        else{r = r->next;}  
//如果不相等,则指针继续移动		  }printf ("\n将值为%d的元素删除后,", (*x));print (head);
//将该链表中所有结点的数据域的值依次打印出来		
}

用一个结点个数为4的单链表举例(头结点不存放元素)

它的原始形态:
在这里插入图片描述

执行语句r = head;和 LinkList* p = r->next;后
在这里插入图片描述

当p->data == (*x)不成立时,指针r, p都要往后移动
在这里插入图片描述

当p->data == (*x)成立时,则要删除指针p所指向的结点
在这里插入图片描述

=======================================
下面是完整的代码,用于验证我们的算法

#include <stdio.h>
#include <malloc.h>
//运用malloc函数需要添加该文件typedef struct node
{int data;struct node* next;} LinkList;
//定义LinkList为struct node的结构体类型,Linklist相当于是struct node的别名//该函数的作用是将链表中各个元素的值依次打印出来 
void print (LinkList* head)
{LinkList* r;
//先定义LinkList*的类型的指针变量 	r = head->next;
//给这个变量分配空间,r指向第一个节点的位置 	printf ("\n该线性表为:");while (r != NULL){printf ("%5d", r->data);r = r->next;} printf ("\n");
}void deletex (LinkList* head, int* x)
//head为头指针,LinkList单链表的存储类型 
{LinkList*r;r = head; while (r->next != NULL)
//当指针r遍历整个链表后,退出while循环	{LinkList* p = r->next; if (p->data == (*x))	
//判断指针p所指向的节点的数据域的值是否与x相等		  {r->next = p->next;free (p);
//删除指针p所指向的结点		    }
//如果相等,则删除该节点	        else{r = r->next;}  
//如果不相等,则指针继续移动		  }printf ("\n将值为%d的元素删除后,", (*x));print (head);
//将该链表中所有结点的数据域的值依次打印出来		
}int main (void)
{	int i, r, len = 5;LinkList* head;head = (LinkList*) malloc (sizeof (LinkList));
//下面是尾插法创建单链表	head->next = NULL;LinkList* q,* tail;tail = head;for (i = 0; i < len; i++){q = (LinkList*) malloc(sizeof (LinkList));printf ("请输入第%d位元素的值:", i + 1);scanf ("%d", &q->data); q->next = NULL;tail->next = q;tail = q;	 }  print (head);int x = 4;deletex (head, &x);return 0;
}
/*结果:
请输入第1位元素的值:4
请输入第2位元素的值:1
请输入第3位元素的值:2
请输入第4位元素的值:3
请输入第5位元素的值:4该线性表为:    4    1    2    3    4将值为4的元素删除后,
该线性表为:    1    2    3
*/

创建单链表用到了尾插法,如果对这个算法不够了解的小伙伴可以看看我写的另一篇文章,里面有详细的讲解

如果有更好的算法,欢迎小伙伴在评论区留言,一起交流学习!!!


http://chatgpt.dhexx.cn/article/dENaom2d.shtml

相关文章

【C语言】好题分享——序列中删除指定元素

目录 前言1️⃣题目2️⃣破题思路及代码演示1.错误反思2.正确示范 3️⃣题目延伸&#x1f4a1;思路一&#xff1a;&#x1f4a1;思路二&#xff1a; 4️⃣总结&#xff1a; 前言 &#x1f389;在此先祝xdm五一快乐&#xff01;&#xff01; 那么&#xff0c;从本blog开始&…

33.【C语言】删除数组中的重复元素(Demo)

算法思想 定义4个变量i、j、k&#xff0c;变量i用于控制外层循环的趟数&#xff0c;外层循环每执行一趟&#xff0c;数组arr的有效长度就缩小&#xff0c;大小为k值。在有效长度为k的范围内arr[i]是没有重复元素的。内层循环j和k每次的初值都是i1&#xff0c;即每次从arr[i]的…

LeetCode移除元素(C语言)

给定一个排序数组&#xff0c;你需要在原地删除重复出现的元素&#xff0c;使得每个元素只出现一次&#xff0c;返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。 示例 1: 给定数组 nums [1,1,2…

C语言删除数组中的重复元素(详细分析版)

&#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f389;推荐up主专题文章 C语言100道经典编程题【详细分析版】 &#x1f4cc;QQ&#xff1a;3052645092 不明白或有问题可以一起讨论哦 &#x1f36d;作者水平很有限&#xff0c;如果发现…

删除多个元素(C语言实现)

删除多个元素 描述格式样例题解及详细注释 描述 从长度为n的整数序列中删除指定位序的m个元素&#xff0c;按照原顺序输出剩余的元素。其中&#xff0c;1≤m≤n≤1000&#xff0c;原整数序列为a&#xff1b;要删除的元素位序按照严格单调递增的方式存储在序列b中&#xff0c;其…

删除数组中重复的元素 C语言

题目介绍&#xff1a; 逻辑实现&#xff1a; 用两个下标 第一个下标src为第二个元素 第二个下标dst为第一个元素 而后 当srcsrc-1时&#xff0c;src&#xff0c;指向下一个元素 &#xff0c;dst不动&#xff0c;如果不等于时候 把src-1的值赋值给dst 尔后两者 注意&#xff1…

详细讲解:C语言删除数组中的某一值的所有元素

具体要求是这样的&#xff0c;通过键盘向程序输入数组中需要删除的数字&#xff0c;程序接到输入后删除数组中所有需要删除的数字。例如&#xff1a; 数组 a[10]{1,2,4,6,4,8,6,2,6,7} 删除数字 :6 输出结果&#xff1a;1 2 4 4 8 2 7想要实现这个功能&#xff0c;其基本思想…

删除数组中重复元素(C语言)

编写函数&#xff0c;删除数组中所有的重复元素&#xff0c;使数组变成一个集合&#xff0c;函数返回集合中元素的个数。 书上习题 #include<stdio.h> int set(int a[],int n) {int i,j,k;for(i0;i<n;i)//每次以a[i]为比较标准{ji1;ki1;while(j<9){if(a[j]a[i]){j…

C语言实现删除元素

给定一组数组&#xff0c;输入一个下标&#xff0c;删除该下标元素并将删除后的数组打印出来。 解题思路&#xff0c;我们主要解决的是删除问题&#xff0c;可以给定一个变量进行循环&#xff0c;让此变量从要删除的下表开始&#xff0c;让被删除的下标的后一个元素赋值给前一个…

STM32工作笔记0021---4G通信模块CAT1和CAT4的区别

技术交流QQ群【JAVA,C,Python,.NET,BigData,AI】&#xff1a;170933152 同是4G模块&#xff0c;CAT1与 CAT4模块的区别有哪些 二 、CAT 与CAT4应用场景对比 CAT1的应用场景&#xff1a;穿戴式设备、智能家电、工业传感器、水文水利的检测、港口物流跟踪。共享支付类。对于宽带…

catboost介绍

一、Catboost简介 全称&#xff1a;Gradient Boosting(梯度提升) Categorical Features(类别型特征)作者&#xff1a;俄罗斯的搜索巨头Yandex官方地址论文链接 | 项目地址 文档地址视频 二、Catboost的特点 一般来说&#xff0c;Gradient Boosting(GB)方法适用于异质化数据。…

nb模块不能接收公网消息_nb模块不能接收公网消息_4G模块Cat1与Cat4的区别究竟在哪里呢?它又为何吸引众多Cat4用户的眼光呢?......

Cat1突然火了&#xff0c;众多行业大佬为其背书。 Cat1凭借其低成本、低功耗等优势与NB-IoT一同扛起了中低速率物联网市场大旗。 与此同时&#xff0c;Cat1也引来众多Cat4用户关注。 那Cat1与Cat4的区别究竟在哪里呢?它又为何吸引众多Cat4用户的眼光呢&#xff1f; 成本优势 1…

【内网学习笔记】20、Hashcat 的使用

1、介绍 Hashcat 是一款用于破解密码的工具&#xff0c;据说是世界上最快最高级的密码破解工具&#xff0c;支持 LM 哈希、MD5、SHA 等系列的密码破解&#xff0c;同时也支持 Linux、Mac、Windows 平台。 工具地址&#xff1a;https://hashcat.net 项目地址&#xff1a;http…

Cat.1和Cat.4的区别

Cat.1 Cat.4 NB-LOT 1.比较2.Cat.1和Cat.4 介绍 1.比较 2.Cat.1和Cat.4 介绍 要区别Cat.1和Cat.4&#xff0c;首先我们要知道Cat是什么。Cat 是 Category 的缩写&#xff0c;中文意思是“类别&#xff0c;种类”。Cat 后面的数字即代表不同的种类&#xff0c;3GPP 将不同种类的…

CAT1 与CAT4 区别与应用

要区别Cat.1和Cat.4&#xff0c;首先我们要知道Cat是什么。Cat 是 Category 的缩写&#xff0c;中文意思是“类别&#xff0c;种类”。Cat 后面的数字即代表不同的种类&#xff0c;3GPP 将不同种类的网络用 “Cat.X” 格式命名。根据 3GPP Release 定义&#xff0c;Cat.X 是用来…

生活网络常识—CAT1与CAT4的区别

大家好&#xff0c;今天给大家讲讲CAT1与CAT4的区别&#xff1b; 给出一张图片让大家生动地看到它们之前的差距与不同&#xff1b; 什么是Cat1与Cat4&#xff1f; 通俗来说我们可以理解为4G网络&#xff08;LTE&#xff09;的种类&#xff0c;分别代表UE的接入能力等级&#…

CAT1和CAT4的区别

现今&#xff0c;CAT1的发展势头一直很迅猛&#xff0c;那为什么CAT4不能替代CAT1的地位呢&#xff1f;&#xff0c;我们来看下面几点&#xff1a; 成本 1. 网络建设方面&#xff0c;Cat1可以无缝接入现有LTE网络当中&#xff0c;无需针对基站进行软硬件升级&#xff0c;网络…

Cat.1、Cat.4、4G之间的区别

什么是Cat.1&#xff1f; Cat.1的全称是LTEUE-Category1&#xff0c;其中UE指的是用户设备&#xff0c;它是LTE网络下用户终端设备的无线性能的分类。根据3GPP的定义&#xff0c;UE类别以1-15分为15个等级。Cat.1&#xff0c;可以称为“低配版”的 4G 终端&#xff0c;上行峰值…

Cat.1和Cat4的应用场景有什么区别

Cat.1是4G通信LTE网络下用户终端类别的一个标准。随着2G网络的承载能力进一步减弱&#xff0c;在新部署的物联网连接中NB-IoT、4G会逐步替代2G模组。相比NB-IoT&#xff0c;Cat.1在网络覆盖、速度和延时上均有优势;相比传统的LTE Cat.4模组则拥有低成本和低功耗优势。 Cat.1与C…

4G通信模块CAT1和CAT4的区别

简介 LTE CAT全名LTEUE-Category&#xff0c;拆开来解释:LTE指的是4GLTE网络、UE是指用户设备、Category翻译为等级。通顺解释就是用户设备能够支持的4GLTE网络传输速率的等级&#xff0c;也可以说成是4G网络速度的一个技术标准。所以LTE CAT1/CAT4就是指用户设备LTE网络接入能…