胚芽ET 2020-07-12 12:03 采纳率: 100%
浏览 139
已采纳

建立链表的函数第二次调用失败

create()函数第二次调用时,返回的链表的头节点地址为空,不知道为什么。

#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(struct ListNode)

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

int n;                           //节点数
struct ListNode* creat(void)     //建立链表(输入链表)的函数
{
    struct ListNode* head, * p1, * p2;
    p1 = p2 = (struct ListNode*)malloc(LEN);   //第一个节点
    scanf_s("%d", &p1->value);
    head = NULL;
    while (p1->value != 0) {      //输入0时候停止建立链表
        n++;                      //节点数
        if (n == 1) {
            head = p1;
        }
        else {
            p2->next = p1;
        }
        p2 = p1;
        p1 = (struct ListNode*)malloc(LEN);
        scanf_s("%d", &p1->value);
    }
    p2->next = NULL;              //p1=p1,结尾

    return head;
}

struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2)
{
    if (l1 == NULL) {
        // l1 为空, 最终结果就是 l2
        return l2;
    }
    if (l2 == NULL) { //l2为空,最终结果就是l1
        return l1;
    }
    ListNode* newHead, * newTail, * cur1, * cur2;
    newHead = newTail = (struct ListNode*)malloc(LEN);   //傀儡节点
    cur1 = l1;
    cur2 = l2;
    //两链表不为空时进入循环
    while (cur1 != NULL && cur2 != NULL) {
        if (cur1->value < cur2->value) {
            newTail->next = cur1;
            newTail = newTail->next;
            cur1 = cur1->next;
        }
        else {
            newTail->next = cur2;
            newTail = newTail->next;
            cur2 = cur2->next;
        }
    }
    //多出的节点直接接到新链表后面
    if (cur1 == NULL) {
        newTail->next = cur2;
    }
    if (cur2 == NULL) {
        newTail->next = cur1;
    }

    return newHead->next;
}


int main()
{
    ListNode* ptr1, * ptr2, * head1, * head2;

    printf("请输入链表:\n");
    head1 = ptr1 = creat();
    printf("请再输入链表:\n");
    head2 = ptr2 = creat();

    printf("输入:");
    while (ptr1 != NULL) {
        printf("%d->", ptr1->value);
        ptr1 = ptr1->next;
    }
    printf("\b\b ,");

    while (ptr2 != NULL) {
        printf("%d->", ptr2->value);
        ptr2 = ptr2->next;
    }
    printf("\b\b  \n");

    ListNode* k;
    k = mergeTwoLists(head1, head2);

    printf("输出:");
    while (k != NULL) {
        printf("%d->", k->value);
        k = k->next;
    }
    printf("\b\b  \n");

    return 0;
}

VS2019中没用错误和警告。

图片说明

我加了一行代码,循环输出前试着输出了一下,发现ptr2是nullptr,第二个链表建立失败?第一次调用creat建立的链表可以,不知道为什么第二次不行。
图片说明

  • 写回答

1条回答 默认 最新

  • qiu_shaofeng 2020-07-12 15:27
    关注

    n++;
    if (n == 1) { //要求n初始为0
    head = p1;
    }
    n是全局变量,第二次调用有问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥15 stable diffusion
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条