CFXLWT 2022-02-24 19:26 采纳率: 81.5%
浏览 21
已结题

C语言链表的问题:依次输入三个数字但是只输出一个并且Node*p指针不会指向下一个结点而是指向NULL

这是个简易链表,我依次输入1 2 3但是最后只会输出1,并且输出1后,Node* p就会指向NULL,我不理解为什么会这样,请各位帮我看看

#include<stdio.h>
#include<stdlib.h> 
typedef struct _node {
    int value;
    struct _node* next;
}Node;
typedef struct {
    Node* head;
}List;
void add(List* plist, int number);
int main(int argc, char* argv[])
{
    List list;
    list.head=NULL;
    int number;
    do {
        scanf("%d", &number);
        add(&list, number);
    } while (number != -1);
    Node*p;
    for(p=list.head;p;p=p->next){
        printf("p=%d\n",p->value);
    }
    return 0;
}
void add(List* plist, int number) 
{
    if (number != -1) 
    {
        Node* p = (Node*)malloc(sizeof(Node));
        p->value = number;
        p->next=NULL;
        Node* last = plist->head;
        if (last)
         {
            while (last->next) {
             last = last->next;
             last->next = p;
            }
        }else {
             plist->head = p;
             }
    }
}

  • 写回答

2条回答 默认 最新

  • 蛋糕店筹备中 2022-02-24 19:41
    关注

    你的第33到36行,判断头指针存不存在,只有第一次添加链表时将1加了上去,后面的2,3由于last存在,所以进入第一个if(last),在判断while时,last->next肯定不存在。建议你把第38行放到while循环外面。

    #include<stdio.h>
    #include<stdlib.h> 
    typedef struct _node {
        int value;
        struct _node* next;
    }Node;
    typedef struct {
        Node* head;
    }List;
    void add(List* plist, int number);
    int main(int argc, char* argv[])
    {
        List list;
        list.head=NULL;
        int number;
        do {
            scanf("%d", &number);
            add(&list, number);
        } while (number != -1);
        Node*p;
        for(p=list.head;p;p=p->next){
            printf("p=%d\n",p->value);
        }
    while (p)
        {
            Node *q = p;
            p = p->next;
            free(q);
        }
    
        return 0;
    }
    void add(List* plist, int number) 
    {
        if (number != -1) 
        {
            Node* p = (Node*)malloc(sizeof(Node));
            p->value = number;
            p->next=NULL;
            Node* last = plist->head;
            if (last)
             {
                while (last->next) {
                 last = last->next;}
                 last->next = p;
            }else {
                 plist->head = p;
                 }
        }
    }
     
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月5日
  • 已采纳回答 2月25日
  • 创建了问题 2月24日

悬赏问题

  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 lammps拉伸应力应变曲线分析
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题
  • ¥30 python代码,帮调试,帮帮忙吧
  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建