标题:单链表(尾插入)创建链表时的问题
只看楼主
卡卡3315
Rank: 1
等 级:新手上路
帖 子:11
专家分:8
注 册:2019-6-24
结帖率:100%
已结贴  问题点数:20 回复次数:4 
单链表(尾插入)创建链表时的问题
程序代码:
#include<stdio.h>
#include<stdlib.h>

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

typedef struct _List{
    Node* head;
}List;//结构用来存储头指针 

void add(List *Plist,int number);//创建链表的函数 
void print(List *Plist);//遍历链表的函数 

int main(void)
{   List list;
    list.head = NULL;
    int number;
    do{
        scanf("%d",&number);
        if(number!=-1){
            add(&list,number);
        }
    }while(number!=-1);
    printf("遍历整个链表\n"); 
    print(&list);//打印整个链表
}
void print(List *Plist)
{   Node *P = NULL;
    for(P = Plist->head; P; P = P->next){
        printf("%d  ",P->num);
    }
    printf("\n");
}
void add(List *Plist,int number)
{
    Node *P = (Node*)malloc(sizeof(Node));
    P->num = number;
    P->next = NULL;
    Node *last = Plist -> head;(这里我原本写的是Node *last = NULL;)
    if(last){
        while (last->next){
            last = last->next;
        }
        last->next = P;
    } else {
        Plist->head = P;
    }
}



在代码中标记的地方, Node *last = Plist -> head; 这一行我原本写的是Node *last = NULL;,因为在main里面list.head就是NULL,反正都是NULL为什么不能直接给Node *last赋上NULL呢

代码结果如下:


这个是错误的结果,遍历只显示最后一个


正确的是显示全部的

忘了free了

[此贴子已经被作者于2020-4-10 23:41编辑过]

搜索更多相关主题的帖子: List Node head number NULL 
2020-04-10 23:39
forever74
Rank: 12Rank: 12Rank: 12
来 自:CC
等 级:贵宾
威 望:49
帖 子:1636
专家分:3940
注 册:2007-12-27
得分:5 
要学会思考运行时的动态过程,在第一行它是NULL,执行到第二行就有可能变了,怎么能用老眼光看到底呢?
你昨天还吃饭了呢,为啥今天还要吃呢?

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2020-04-11 00:12
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:5 
#include<stdio.h>
#include<stdlib.h>

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

List* CreateList(int number);
List* add(List *Plist,int number);//创建链表的函数
void print(List *Plist);//遍历链表的函数

int main(void)
{
    List *head=NULL, *tail;
    int number;
    while(scanf("%d",&number)==1 && number!=-1)
    {
        if (head)
        {
            if ((tail=add(tail,number)) == NULL)
                break;
        }
        else
        {
            if ((head=CreateList(number)) == NULL)
                break;
            tail = head;
        }
    }
    printf("遍历整个链表\n");
    print(head);//打印整个链表
}

void print(List *Plist)
{
    for(; Plist; Plist=Plist->next)
        printf("%d\n",Plist->num);
}

List* CreateList(int number)
{
    List *P = (List*)malloc(sizeof(List));
    if (P)
    {
        P->num = number;
        P->next = NULL;
    }
    return P;
}

List* add(List *Plist,int number)
{
    Plist->next = (List*)malloc(sizeof(List));
    if (Plist->next)
    {
        Plist->next->num = number;
        Plist->next->next = NULL;
    }
    return Plist->next;
}


[此贴子已经被作者于2020-4-11 10:58编辑过]

2020-04-11 10:54
hbccc
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:108
专家分:315
注 册:2020-2-18
得分:5 
为什么一看到链表、指针啥的,就头大呢
2020-04-12 14:47
LGD335060087
Rank: 2
等 级:论坛游民
帖 子:36
专家分:13
注 册:2020-3-15
得分:5 
程序代码:
void add(List *Plist,int number)
{
    Node *P = (Node*)malloc(sizeof(Node));
    P->num = number;
    P->next = NULL;
    Node *last = Plist -> head;(这里我原本写的是Node *last = NULL;)
    if(last){
        while (last->next){
            last = last->next;
        }
        last->next = P;
    } else {
        Plist->head = P;
    }
}

你是需要查找最后一个节点当然不能给它赋值为NULL,如果你给它赋值为NULL就已经证明它是最后一个节点(查找节点信息必须从链表的头开始)

知识改变命运,代码更改时代
2020-04-12 16:18



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-500987-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013650 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved