[PTA]实验11-2-4 删除单链表偶数节点

Posted Spring-_-Bear

tags:

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

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

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

函数接口定义:

struct ListNode *createlist();
struct ListNode *deleteeven( struct ListNode *head );

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

函数deleteeven将单链表head中偶数值的结点删除,返回结果链表的头指针。

裁判测试程序样例:

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

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

struct ListNode *createlist();
struct ListNode *deleteeven( struct ListNode *head );
void printlist( struct ListNode *head )
{
     struct ListNode *p = head;
     while (p) {
           printf("%d ", p->data);
           p = p->next;
     }
     printf("\\n");
}

int main()
{
    struct ListNode *head;

    head = createlist();
    head = deleteeven(head);
    printlist(head);

    return 0;
}

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

输入样例:

1 2 2 3 4 5 6 7 -1

输出样例:

1 3 5 7 
  • 提交结果:

在这里插入图片描述

  • 源码:
#include <stdio.h>
#include <stdlib.h>

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

struct ListNode* createlist();
struct ListNode* deleteeven(struct ListNode* head);
void printlist(struct ListNode* head)
{
    struct ListNode* p = head;
    while (p) {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\\n");
}

int main()
{
    struct ListNode* head;

    head = createlist();
    head = deleteeven(head);
    printlist(head);

    return 0;
}

/* 你的代码将被嵌在这里 */
struct ListNode* createlist()
{
    struct ListNode* head, * tail, * temp;      // 头节点、尾节点、临时节点

    // 为头节点分配内存,头节点不存储信息
    head = (struct ListNode*)malloc(sizeof(struct ListNode));
    // 头节点指向空
    head->next = NULL;
    // 此时头、尾节点相同
    tail = head;

    int data;

    scanf("%d", &data);

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

        // 将临时节点连接到链表尾
        tail->next = temp;
        // 更新尾节点
        tail = temp;

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

    return head;
}

struct ListNode* deleteeven(struct ListNode* head)
{
    struct ListNode* current = head;   // 当前节点

    // 链表为空
    if (!head)
    {
        return NULL;
    }

    // 由于头节点不存储数据,故需从head->next开始遍历链表
    while (current->next)
    {
        // 偶数节点,需要删除
        if (current->next->data % 2 == 0)
        {
            // 临时节点,保存当前节点(current->next)
            struct ListNode* temp = current->next;
            // 当前节点的下个节点的地址覆盖当前节点的地址
            current->next = temp->next;
            // 释放当前节点
            free(temp);
        }
        else
        {
            current = current->next;
        }
    }

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

    return head;
}

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

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

第九小组

一·PTA实验作业

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

线性表练习之Example011-分解链表中的奇数节点和偶数节点

第02次作业-线性表