6-28 递增的整数序列链表的插入 (15 point(s))

By | 最新修改:2024-08-17

声明

这是 拼题A(PTA)《中M2019秋C入门和进阶练习集》的习题。原题在 https://pintia.cn/problem-sets/1163286449659043840/problems/1174288506294865947 (侵删)

本人的答案仅供交流学习,请勿用于当作答案来提交!

题目描述

6-28 递增的整数序列链表的插入 (15 point(s))

本题要求实现一个函数,在递增的整数序列链表(带头结点)中插入一个新整数,并保持该序列的有序性。

函数接口定义:
List Insert( List L, ElementType X );
其中List结构定义如下:

typedef struct Node *PtrToNode;
struct Node {
    ElementType Data; // 存储结点数据
    PtrToNode   Next; // 指向下一个结点的指针
};
typedef PtrToNode List; // 定义单链表类型 

L是给定的带头结点的单链表,其结点存储的数据是递增有序的;函数Insert要将X插入L,并保持该序列的有序性,返回插入后的链表头指针。

裁判测试程序样例:

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

typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
    ElementType Data;
    PtrToNode   Next;
};
typedef PtrToNode List;

List Read(); // 细节在此不表
void Print( List L ); // 细节在此不表

List Insert( List L, ElementType X );

int main()
{
    List L;
    ElementType X;
    L = Read();
    scanf("%d", &X);
    L = Insert(L, X);
    Print(L);
    return 0;
}

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

输入样例:
5
1 2 4 5 6
3
输出样例:
1 2 3 4 5 6

我的答案

/*================================================================
*   Copyright (C) 2019 程序知路. All rights reserved.
*   
*   Filename    :6-28-递增的整数序列链表的插入.c
*   Author      :程序知路
*   E-Mail      :admin@icxzl.com
*   Create Date :2019年11月19日
*   Description :
================================================================*/
#include <stdio.h>
#include <stdlib.h>

typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
    ElementType Data;
    PtrToNode   Next;
};
typedef PtrToNode List;

List Read(); // 细节在此不表
void Print( List L ); // 细节在此不表

List Insert( List L, ElementType X );

int main()
{
    List L;
    ElementType X;
    L = Read();
    scanf("%d", &X);
    L = Insert(L, X);
    Print(L);
    return 0;
}

void Print( List L ) {
    if (L) {
        L = L->Next;
    }
    while (L) {
        printf("%d ", L->Data);
        L = L->Next;
    }
}

List Read() {
    int elemCount;
    int input;
    scanf("%d", &elemCount);

    List head = (List) malloc(sizeof(struct Node));
    List p = NULL, current = NULL, prev = NULL;
    while (elemCount-- > 0) {
        scanf("%d", &input);
        if (!p) {
            p = (List) malloc(sizeof(struct Node));
            p->Data = input;
            p->Next = NULL;
            head->Next = p;
            current = p;
        } else {
            current = (List) malloc(sizeof(struct Node));
            current->Data = input;
            current->Next = NULL;
            prev->Next = current;
        }

        prev = current;
    } 


    return head;
}

// 有效代码
List Insert(List L, ElementType X) {
    List head = NULL;
    if (L) {
        // 因为题目要求“带头结点”,
        // 因此链表头的数据为空;
        // 故要从第二个结点开始。
        head = L->Next;
    }
    List p = head;
    List prev = head;

    while (p != NULL) {
        if (p->Data >= X) {
            break; 
        }

        prev = p;
        p = p->Next;
    }

    List insert = (List) malloc(sizeof(struct Node));
    insert->Data = X;
    insert->Next = NULL;
    if (p == NULL) {
        if (p != head) {
            prev->Next = insert;
        } else {
            head = insert;
            L->Next = head;
        }
    } else {
        if (p == head) {
            insert->Next = head;
            head = insert;
            L->Next = head;
        } else {
            insert->Next = p;
            prev->Next = insert;
        }
    }

    return L;
}


程序知路

鉴于本人的相关知识储备以及能力有限,本博客的观点和描述如有错漏或是有考虑不周到的地方还请多多包涵,欢迎互相探讨,一起学习,共同进步。

本文章可以转载,但是需要说明来源出处!

本文使用的部分图片来源于网上,若是侵权,请与本文作者联系删除: admin@icxzl.com