如何在链接列表的末尾添加节点?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在链接列表的末尾添加节点?相关的知识,希望对你有一定的参考价值。

首先,在您告诉我之前,我检查了此站点上的其他问题,然后按照说明进行操作。我的程序仍然存在错误。

这是我编写的代码,但是根本没有开始

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

typedef struct node 
    int num;
    struct node *next;
Tnode;

Tnode *head;

typedef Tnode *Tlist;

void insert(int);

void printlist();

Tnode *makenode(int x);

Tlist MakeList ();

void InsertAtEnd (Tlist list,int x);

void infoPrint (int info);

void PrintList(Tlist list);

int main(int argc, char** argv) 
    int n,i,x;
    Tlist list=MakeList();
    printf("Creiamo una lista; quanti elementi vuoi inserire ? ");//translation "how many elements in the list ?"

    scanf("%d",&n);

    for(i=0;i<n;i++)
        printf("\n Inserisci valore da inserire ");//translation "insert the element" 
        scanf("%d",&x);
        InsertAtEnd(list,x);
        PrintList(list);
    
    return (EXIT_SUCCESS);


Tlist MakeList ()
return NULL;


void insert(int x)
    Tnode *temp= makenode(x);
    temp->next=head;
    head=temp;
    

Tnode *makenode(int x)
    Tnode *new=malloc(sizeof(Tnode));
    if (new==NULL)
        return NULL;
    new->num=x;
    new->next=NULL;
    printf(".");
    return new;


void infoPrint (int info) 
    printf (" %d ", info);


void PrintList(Tlist list)
    Tnode *node=list;
    while(node!=NULL)
        infoPrint(node->num);
        node=node->next;
    


void InsertAtEnd (Tlist head,int x)
    Tnode *newNode,*tmp;
    newNode=makenode(x);
    tmp=head;

    while(tmp->next!=NULL)
        tmp=tmp->next;
        tmp->next=newNode;

    


当我建造它时,有0个问题。当我运行它时,只要插入列表的fisrt值,它就会停止。我如何使其工作?

答案

您的程序具有MakeList函数,该函数返回NULL。

此NULL被分配给列表。

然后您将列表发送给insertAtEnd函数。

[求值while statement时,它转储内核(分段故障),程序退出。

这就是您的程序突然退出的原因。

制作以下模组-

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

typedef struct node 
    int num;
    struct node *next;
Tnode;

Tnode *head;

typedef Tnode *Tlist;

void insert(int);

void printlist();

Tnode *makenode(int x);

Tlist MakeList ();

Tlist InsertAtEnd (Tlist list,int x); // changed prototype

void infoPrint (int info);

void PrintList(Tlist list);

int main(int argc, char** argv) 
    int n,i,x;
    Tlist list=MakeList();
    printf("Creiamo una lista; quanti elementi vuoi inserire ? ");//translation "how many elements in the list ?"

    scanf("%d",&n);

    for(i=0;i<n;i++)
        printf("\n Inserisci valore da inserire ");//translation "insert the element"
        scanf("%d",&x);
        list = InsertAtEnd(list,x); // changed call to function...
        PrintList(list);
    
    return (EXIT_SUCCESS);


Tlist MakeList ()
return NULL;


void insert(int x)
    Tnode *temp= makenode(x);
    temp->next=head;
    head=temp;
    

Tnode *makenode(int x)
    Tnode *new=malloc(sizeof(Tnode));
    if (new==NULL)
        return NULL;
    new->num=x;
    new->next=NULL;
    printf(".");
    return new;


void infoPrint (int info) 
    printf (" %d ", info);


void PrintList(Tlist list)
    Tnode *node=list;
    while(node!=NULL)
        infoPrint(node->num);
        node=node->next;
    


Tlist InsertAtEnd (Tlist head,int x)
    Tnode *newNode,*tmp;
    newNode=makenode(x);
    tmp=head;

    if (tmp == NULL)
        head = newNode;
    else
    
            while(tmp->next!=NULL)
                    tmp=tmp->next;
            
            tmp->next = newNode;
    
    return head;


另一答案

功能InsertAtEnd出了问题。

您不关心第一个元素的大小写。为此,需要修改功能定义。您可以将双指针指向head到此函数。

此外,tmp->next=newNode;的分配应在for循环之后。

您应避免创建指针类型TList,将指针传递到Tnode会更整洁和容易。>

void InsertAtEnd (Tnode ** head,int x)
    Tnode *newNode,*tmp;
    newNode=makenode(x);
    tmp=*head;

    if (tmp == NULL)
    
        *head = newNode;
    
    else
    
        while(tmp->next!=NULL)
            tmp=tmp->next;
        
        tmp->next=newNode;

    


// in main call it with
InsertAtEnd(&list,x);

以上是关于如何在链接列表的末尾添加节点?的主要内容,如果未能解决你的问题,请参考以下文章

无法弄清楚如何通过仅使用类的函数删除整个链接列表

如何从片段内的列表视图打开链接网址?

如何在ListView末尾添加“更多”按钮以加载更多项目?

c_cpp 从链接列表的末尾开始编程第n个节点

Javascript中链接列表和节点的问题

保留对附加节点 javascript 的引用