当前位置:   article > 正文

C语言(每日一题)——数据结构——在一条创建好的单链表中删除所有值为x的节点(详细过程)_做单链表删除的题目:构造一个单链表的删除算法,把单链表中所有值为 x 的元素

做单链表删除的题目:构造一个单链表的删除算法,把单链表中所有值为 x 的元素

//在list指向的链表中,找到值为x的节点然后将其删除,假如没有找到值为x的节点则直接返回,如果有多个值为x的节点,则删除第一个.

定义结构体

#include <stdio.h>//printf
#include <stdlib.h>//malloc
#include <string.h>//strlen

typedef int Elemtype; //数据元素的类型
//定义数据节点
typedef  struct node
{
    Elemtype data;  //数据域:保存数据本身用的
    struct node *next; //指针域:用来保存关系用的,保存下一个数据节点的地址
    
}Node;

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
/*
	Delete_X_Node:在list指向的链表中,找到值为x的节点然后将其删除,假如没
		有找到值为x的节点则直接返回,如果有多个值为x的节点,则全部删除。
		@list	: 要删除节点的单链表
		@x		: 要删除的元素
		@return : 将删除节点后的链表的首节点的地址返回
*/
Node *Delete_X_Node(Node *list, Elemtype x)
{
    Node *p = list;
    Node *pre = NULL;
	//1.找到值为x的节点
	while(p)
	{
	if(p->data == x)
		{
			//2.分情况删除
                if(p == list)//值为x的节点在首节点
                {
                    list = list->next;
                    p->next = NULL;
                    free(p);
				    p = list;
                }
                else//值为x的节点插入到中间节点/尾结点的前面去
                {
                    pre->next = p->next;
                    p->next = NULL;
                    free(p);
				    p = pre->next;
                }
            }      
    else//p指向的节点的值不是x
	{
		pre = p;
		p = p->next;
	}  
}
   return list;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
/*
	Print_Lisklist:将一条单链表打印出来
		@list	: 要打印的链表
*/
void Print_Linklist(Node *list)
{
    Node *p = list;
    while(p){
        printf("%d ",p->data);
        p = p->next;
    }
  putchar('\n');
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

//请根据用户的输入创建一个线性表,以0作为结尾。
	//以链式结构(链表)的方式去保存线性表中的数据。
int main()
{
	//在list指向的链表中,找到值为x的节点然后将其删除,假如没有找到值为x的节点
	//则直接返回,如果有多个值为x的节点,则全部删除。
	
	//创建链表函数参考我之前发的,不再说明,这里直接调用它
	Node *list = Create_Linklist();//list指向创建出来的有序单链表的首节点
	Print_Linklist(list);

	Elemtype x;
	printf("请输入要删除的元素:\n");
	scanf("%d",&x);
	list = Delete_X_Node(list,x);
	Print_Linklist(list);
	return 0;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
**运行结果**

  • 1
  • 2

在这里插入图片描述

大家有什么问题可以私信我哦!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/444238
推荐阅读
相关标签
  

闽ICP备14008679号