[PTA]实验11-2-8 单链表结点删除

Posted Spring-_-Bear

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[PTA]实验11-2-8 单链表结点删除相关的知识,希望对你有一定的参考价值。

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

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;
}

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

输入样例:

10 11 10 12 10 -1
10

输出样例:

11 12 
  • 提交结果:

在这里插入图片描述

  • 源码:
#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* pHead, * pTail, * pTemp;   // 头节点,尾节点,临时节点

    // 头节点不存储值
    pHead = (struct ListNode*)malloc(sizeof(struct ListNode));
    // 头节点指向空
    pHead->next = NULL;
    // 此时的头节点跟尾节点是同一个节点
    pTail = pHead;

    int number;

    scanf("%d", &number);

    while (number != -1)
    {
        // 为临时节点分配内存
        pTemp = (struct ListNode*)malloc(sizeof(struct ListNode));
        // 临时节点指向空
        pTemp->next = NULL;
        // 数据域存入数据
        pTemp->data = number;

        // 将临时节点连接到链表尾部
        pTail->next = pTemp;
        // 尾节点后移
        pTail = pTemp;

        scanf("%d", &number);
    }

    return pHead;
}

struct ListNode* deletem(struct ListNode* L, int m)
{
    struct ListNode* LTemp = L;   // 拷贝L链表

    // 因为头节点不存储值,故从头节点的下一个节点开始遍历
    // 当前节点尾LTmp->next
    while (LTemp->next)
    {
        if (LTemp->next->data == m)
        {
            // 临时节点,保存当前节点,便于释放
            struct ListNode* Temp = LTemp->next;    
            // 将当前节点(LTemp->next)的下一节点的地址覆盖掉当前节点的地址
            LTemp->next = Temp->next;
            // 释放当前节点
            free(Temp);
        }
        else
        {
            LTemp = LTemp->next;
        }
    }

    // 头节点不存储值
    L = L->next;

    return L;
}

以上是关于[PTA]实验11-2-8 单链表结点删除的主要内容,如果未能解决你的问题,请参考以下文章

[PTA]习题11-8 单链表结点删除

[PTA]实验11-2-6 奇数值结点链表

一·PTA实验作业

单链表结点的插入与删除

[PTA]6-6 求单链表结点的阶乘和

PTA——6-1 单链表逆转 (20分)