注册 登录
编程论坛 C语言论坛

单链表(尾插入)创建链表时的问题

卡卡3315 发布于 2020-04-10 23:39, 2291 次点击
程序代码:
#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编辑过]

4 回复
#2
forever742020-04-11 00:12
要学会思考运行时的动态过程,在第一行它是NULL,执行到第二行就有可能变了,怎么能用老眼光看到底呢?
你昨天还吃饭了呢,为啥今天还要吃呢?
#3
吹水佬2020-04-11 10:54
#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编辑过]

#4
hbccc2020-04-12 14:47
为什么一看到链表、指针啥的,就头大呢
#5
LGD3350600872020-04-12 16:18
程序代码:
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就已经证明它是最后一个节点(查找节点信息必须从链表的头开始)
1