撸猫791 2024-06-24 19:20 采纳率: 66.7%
浏览 1
已结题

链表,输出结果为啥出错


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


typedef struct student{
    int num;
    student *next;
}student;


student *Create_stu_Doc(int n){
    int num;
    student *head,*tail,*p;
    head=tail=NULL;
    int size=sizeof(student);
    printf("输入num:");
    for(int i=1;i<=n;i++){
        scanf("%d",&num);
        p->num=num;
        
        if(head==NULL)
           head=p; 
        else 
           tail->next=p;
        tail=p;
    }
}


void Print_Stu_Doc(student *head){
    student *ptr;
    if(head==NULL){
        printf("错误");
        return; 
    }
    for(ptr=head;ptr!=NULL;ptr=ptr->next){
        printf("%d\n",ptr->num);
    }
}


int main (){
    int n;
    scanf("%d",&n);
    student *head=Create_stu_Doc(n);
    Print_Stu_Doc(head);
    return 0;
}

以上代码的结果为什么是这样

img

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-24 19:20
    关注

    引自免费微信小程序:皆我百晓生

    这段代码在创建一个包含n个学生的链表后,试图打印每个学生的学号。然而,在运行时,它将第一个学生(即头结点)作为最后一个学生(尾部节点),导致链表循环并产生错误。

    要解决这个问题,我们需要确保链表正确地连接起来。以下是修复后的代码:

    #include<stdio.h>
    #include<stdlib.h>
    
    typedef struct student {
        int num;
        struct student* next;
    } student;
    
    student* Create_stu_Doc(int n) {
        int num;
        student *head, *tail, *p;
        head = tail = NULL;
        int size = sizeof(student);
    
        printf("输入num:");
        for (int i = 1; i <= n; i++) {
            scanf("%d", &num);
            p = (student*)malloc(sizeof(student));
            p->num = num;
    
            if (head == NULL) {
                head = p;
                tail = p;
            } else {
                tail->next = p;
                tail = p;
            }
        }
    
        return head;
    }
    
    void Print_Stu_Doc(student* head) {
        student* ptr;
        if (head == NULL) {
            printf("错误");
            return;
        }
        for (ptr = head; ptr != NULL; ptr = ptr->next) {
            printf("%d\n", ptr->num);
        }
    }
    
    int main() {
        int n;
        scanf("%d", &n);
        student* head = Create_stu_Doc(n);
        Print_Stu_Doc(head);
        free(head); // 清理内存
        return 0;
    }
    

    这个修复版本首先为每个新添加的学生分配内存,并将其连接到链表中。然后,它正确地打印了所有学生的学号,从而解决了原始代码中的错误。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 7月2日
  • 已采纳回答 6月24日
  • 创建了问题 6月24日

悬赏问题

  • ¥15 一道ban了很多东西的pyjail题
  • ¥15 关于#r语言#的问题:如何将生成的四幅图排在一起,且对变量的赋值进行更改,让组合的图漂亮、美观@(相关搜索:森林图)
  • ¥15 C++识别堆叠物体异常
  • ¥15 微软硬件驱动认证账号申请
  • ¥15 有人知道怎么在R语言里下载Git上的miceco这个包吗
  • ¥15 GPT写作提示指令词
  • ¥20 根据动态演化博弈支付矩阵完成复制动态方程求解和演化相图分析等
  • ¥20 关于DAC输出1.000V对分辨率和精度的要求
  • ¥15 华为超融合部署环境下RedHat虚拟机分区扩容问题
  • ¥15 哪位能做百度地图导航触点播报?