【c语言篇】每日一题-pta-实验11-2-8 单链表结点删除

题目如下:

裁判测试程序样例:

cs 复制代码
#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;
}

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

代码如下:

cs 复制代码
struct ListNode *readlist()
{
    struct ListNode *head, *p1, *p2;//创建指针变量
    int n = 0;                      //创建整型变量
    head = NULL;                    //初始化
    scanf("%d", &n);                // 读取第一个整数

    while (n != -1) // 当整数不等于 -1 时
    {
        p1 = (struct ListNode *)malloc(sizeof(struct ListNode)); // 为新节点分配内存
        p1->data = n; // 将整数值存储到新节点的 data 字段

        if (head == NULL) // 如果链表为空
        {
            head = p1; // 设头指针为 p1
            p2 = p1; // 设 p2 为 p1
        }
        else
        {
            p2->next = p1; // 在链表尾部添加新节点
            p2 = p1; // 更新指针 p2 以指向新添加的节点
        }
        scanf("%d", &n); // 再次读取一个整数
    }

    p2->next = NULL; // 将链表尾部设置为 NULL
    return head; // 返回链表头指针
}

//删除数值等于m的节点
struct ListNode *deletem(struct ListNode *L, int m)
{
    //指针L指向链表头
    struct ListNode *p1, *p2 = NULL, *a;
    p1 = L;//初始化为链表头指针
    while (p1 != NULL)//p1用于遍历链表,p2用于跟踪遍历过程中p1的前一个结点
    {
        if (p1->data == m)
        {
            if (p2 == NULL)//即p1为链表的头结点
            {
                L = p1->next;//使头指针指向p1->next
                a = p1;//用a来释放
                p1 = p1->next;
                free(a);
            }
            else//p1 不是头节点
            {
                p2->next = p1->next;//将p2->next更新为p1->next以删除当前节点p1
                a = p1;
                p1 = p1->next;
                free(a);
            }
        }
        else
        {
            p2 = p1;
            p1 = p1->next;
        }
    }
    return L;
}
相关推荐
脸大是真的好~8 分钟前
黑马JAVA+AI 加强07 Stream流-可变参数
java·开发语言
m0_7369270428 分钟前
使用 Python 将 PowerPoint 转换为 Word 文档
java·开发语言·后端·职场和发展·c#
杜子不疼.37 分钟前
【Rust】路由匹配与参数提取:从 match 语句到 axum 的类型魔法
开发语言·后端·rust
夜晚中的人海1 小时前
【C++】位运算算法习题
开发语言·c++·算法
裸奔在上海1 小时前
使用Java做URL短连接还原长链接获取参数
java·开发语言·程序人生·spring
爱吃烤鸡翅的酸菜鱼1 小时前
如何掌握【Java】 IO/NIO设计模式?工厂/适配器/装饰器/观察者模式全解析
java·开发语言·后端·设计模式·nio
程序员大雄学编程1 小时前
「用Python来学微积分」17. 导数与导函数
开发语言·python·数学·微积分
扶尔魔ocy1 小时前
【QT常用技术讲解】可拖拽文件的Widget--QListWidget
开发语言·qt
枫叶丹41 小时前
【Qt开发】布局管理器(一)-> QVBoxLayout垂直布局
开发语言·c++·qt
I'm Jie2 小时前
Gradle 的项目结构与源码集(Source Sets)详解(Kotlin DSL)
android·java·开发语言·spring boot·spring·kotlin·gradle