代码编织梦想

本题要求实现两个函数,分别将读入的数据存储为单链表、将链表中所有存储了某给定值的结点删除。链表结点定义如下:

struct ListNode {
    int data;
    ListNode *next;
};

函数接口定义:

struct ListNode *readlist();
struct ListNode *deletem( struct ListNode *L, int m );

函数readlist从标准输入读入一系列正整数,按照读入顺序建立单链表。当读到−1时表示输入结束,函数应返回指向单链表头结点的指针。

函数deletem将单链表L中所有存储了m的结点删除。返回指向结果链表头结点的指针。

裁判测试程序样例:

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

struct ListNode {
    int data;
    struct ListNode *next;
};

struct ListNode *readlist();
struct ListNode *deletem( struct ListNode *L, int m );
void printlist( struct ListNode *L )
{
     struct ListNode *p = L;
     while (p) {
           printf("%d ", p->data);
           p = p->next;
     }
     printf("\n");
}

int main()
{
    int m;
    struct ListNode *L = readlist();
    scanf("%d", &m);
    L = deletem(L, m);
    printlist(L);

    return 0;
}

/* 你的代码将被嵌在这里 */

看了一些题解,都没有设置头节点,直接在第一个节点存数据,这样反而在逻辑细节上不易理解。其实设置头节点逻辑更清晰,代码也简化了很多,比较容易理解。

struct ListNode* readlist() {		
    struct ListNode* head, * tail;
    head = malloc(sizeof(struct ListNode));
    tail = head;
    while (1) {
        struct ListNode* ptr = (struct ListNode*)malloc(sizeof(struct ListNode));		// 创建新节点
        scanf("%d", &ptr->data);				// 插入数据
        if (ptr->data == -1)  break;
        tail->next = ptr;						// 连接到新结点
        tail = ptr;								// 尾指针下移
    }
    tail->next = NULL;							// 循环结束,给尾指针的next赋值为空
    return head;
}
struct ListNode* deletem(struct ListNode* L, int m) {
    struct ListNode* head, * ptr;
    ptr = L, head = L;
    while(ptr->next != NULL) {		// 因为头节点不存数据,所以直接从头结点的next遍历
        if (ptr->next->data == m) {
            struct ListNode* del = (struct ListNode*)malloc(sizeof(struct ListNode));		// 创建指针
            del = ptr->next;					// 指向这个即将被释放的空间
            ptr->next = ptr->next->next;		// 跳过要删除的节点,指向被删节点的下一个节点
            free(del);			// 释放被删节点的内存空间
            continue;							
        }
        ptr = ptr->next;
    }
    return head->next;					// 这里注意返回的是第二个节点,因为头节点是不存数据的,第二个节点保存的就是的第一份数据
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yinpp_/article/details/126911022

第1章第2节练习题21 输出并删除最小值结点-爱代码爱编程

问题描述 设有一个带头结点的循环单链表,其结点值均为正整数。设计一个算法,反复找出单链表中结点值的最小的结点并输出,然后将该结点从中删除,直到单链表空为止,最后删除头结点 算法思想 本题可以借鉴 第1章

pta 6-11 单链表结点删除 (20 分) c语言。_一只彩乌鸦的博客-爱代码爱编程

** 6-11 单链表结点删除 (20 分) 原创文章,欢迎转载,转载时请附上链接: https://blog.csdn.net/weixin_43527871/article/details/89523815 相似题型

pta 6-12 学生成绩链表处理 (20 分) c语言。_一只彩乌鸦的博客-爱代码爱编程

** 6-12 学生成绩链表处理 (20 分) 原创文章,欢迎转载,转载时请附上链接:https://blog.csdn.net/weixin_43527871/article/details/89524183 相似题型

pta 6-13 删除单链表偶数节点 (20 分) c语言。_一只彩乌鸦的博客-爱代码爱编程

** 6-13 删除单链表偶数节点 (20 分) **原创文章,欢迎转载,转载时请附上链接: https://blog.csdn.net/weixin_43527871/article/details/89524900

单链表的基本操作-爱代码爱编程

  (1) 用表头插入法创建单链表; (2) 用表尾插入法创建单链表; (3) 在单链表的第i个结点前插入一个结点; (4) 删除单链表中第i个结点; (5) 删除单链表中指定值的结点; (6) 删除单链表中结点值等于e的所有结点; (7) 输出链表元素; (8) 清空单链表。 #define OVERFLOW

【数据结构】单链表的相关操作--创建-插入-删除-查找-爱代码爱编程

文章目录 单链表的相关操作单链表的创建单链表的插入按位序插入指定结点的后插操作指定结点的前插操作单链表的删除按位序删除指定结点的删除单链表的查找按位查找按值查找 单链表的相关操作 单链表的创建 关于带头结点与不带头结点,不带头结点表示指针指向的第一个结点就是要存放数据的结点,而带头结点表示指针指向的第一个结点内数据域不存任何数据,其指向的下

数据结构——线性表(链表)-爱代码爱编程

文章目录 单链表单链表声明单链表初始化(带头结点)单链表判断是否为空(带头结点)单链表判断是否为空(不带头结点)单链表按位序插入(带头结点)单链表按位序插入(不带头结点)单链表后插操作单链表前插操作单链表删除(带头结点)单链表删除(不带头结点)单链表删除指定节点单链表按位查找单链表按值查找求单链表的长度(带头结点)求单链表的长度(不带头结点)尾插法

最全链表编程题及完整代码(单链表逆置、删除、查找、合并与拆分、子序列等)持续更新-爱代码爱编程

文章目录 单链表逆置从尾到头反向输出每个结点的值带头结点的单链表就地逆置单链表删除操作删除不带头结点的单链表L中所有值为x的结点删除带头结点的单链表L中所有值为x的结点删除递增有序单链表中的重复元素删除无序单链表中绝对值相等的元素删除带头结点的循环单链表中最小值结点单链表排序使单链表L中的元素递增有序单链表合并与拆分将两个递增有序的单链表归并为一个

数据结构(二):链表-爱代码爱编程

文章目录 一、链表的概念及其结构二、单链表的实现1.单链表的访问2.单链表头部插入数据3.单链表尾部插入数据4.单链表头部删除数据5.单链表尾部删除数据6.查找单链表中值为x的结点7.在某一结点的后面插入一个结点8.在某一结点的后面删除一个结点三、单链表的优劣四、 带头循环双向链表的实现1.双向链表的初始化2.双向链表尾部插入数据3.双向链表头部插

双向链表学习-爱代码爱编程

双向链表 一、单链表与双链表: 单链表,查找的方向只能是一个方向,而双链表可以前或后查找。单链表不能自我删除,需要辅助结点,而双向链表则可以实现自我删除。所以前面我们删除单链表的结点时,会找一个辅助结点temp,temp是删除的结点的前一个结点。二、双向链表图解 说明:双向链表比起单链表来说,多了一个指向前一个结点的地址的pre。 三、代码

C语言数据结构(2)——单链表-爱代码爱编程

单链表 1.单链表基本数据类型2.创建单链表结点3.打印链表4.尾部插入结点5.删除尾部结点6.头部插入结点7.删除头部节点8.寻找结点9.在指定位置之前插入结点10.在指定位置之后插入结点11.删除指定位置的结点12.销毁链表13.实操 1.单链表基本数据类型 typedef int SLTDataType; //单链表 typedef

C语言单链表入门讲解(附例题)-爱代码爱编程

“ Ctrl AC!一起 AC!” 目录 前言: 单链表的定义及结点: 单链表的定义: 单链表结点的结构体: 单链表的建立: 在单链表中插入一个数据为x的新结点: 尾插法建立链表: 单链表的遍历: 遍历释放内存: 遍历输出数据: 单链表查找并删除结点: 查找结点核心代码: 删除结点核心代码: 查找并删除结点函数: 例题:

c 语言数据结构系列,单链表常见操作之几种插入和删除的实现-爱代码爱编程

c 语言数据结构之单链表 1,定义一个单链表1,不带头结点的单链表2,带头结点的单链表2,单链表的基本操作1,插入1,按位序插入(ListInsert(&L,i,e))2,指定结点的后插操作(InsertNextNode(LNode *p,ElemType e)3,指定结点的前插操作( InsertPrioNode(LNode *p,Ele

数据结构单链表的基础操作_贪吃的小狗的博客-爱代码爱编程

#include <iostream> #include <stack> using namespace std; //链表结点声明如下: struct ListNode {     int m_nKey;     ListNode * m_pNext; }; ////1. 求单链表中结点的个数 //2. 将单链表反转 //3.