Как добавить узел в конец связанного списка? - PullRequest
0 голосов
/ 06 января 2020

Прежде всего, прежде чем вы скажете мне, я проверил другие вопросы на этом сайте, и я следовал инструкциям. Тем не менее в моей программе есть ошибки.

вот код, который я сделал, но он вообще не запускается

#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 проблем. Когда я запускаю его, он останавливается, как только я вставляю первое значение в списке. Как мне заставить это работать?

Ответы [ 2 ]

1 голос
/ 06 января 2020

Ваша программа имеет функцию 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;
}

0 голосов
/ 06 января 2020

Функция InsertAtEnd является проблемой.

Вы не заботитесь о случае первого элемента. Для этого необходимо изменить определение функции. Вы можете передать двойной указатель на head этой функции.

Кроме того, присваивание tmp->next=newNode; должно быть после for l oop.

Вам следует избегать создания тип указателя 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);

...