Как создать односвязный список с вводом в C

#c #linked-list #singly-linked-list

Вопрос:

Нам было поручено создать связанный список со следующими результатами:

 Enter number of nodes: 5

12 4 5 44 45

The linked list:

12 4 5 44 45
 

Я очень запутался в связанных списках, мой код следующий

 #include <iostream>
using namespace std;

struct Node{
    int data;
    int nodeNumber;
    Node *next;
}*nodePtr=NULL,*nodeTemp=NULL,*nodeHead=NULL;

void addNode (int num, int nodeSize);
void displayNode();

int main(){
    int size, value;

    cout<<"Enter number of Nodes: ";
    cin>>size;

    for (int i=0; i<size; i  ){
        cin>>value;
        addNode(value,size);
        //These are just to check if the data is being stored correctly in the structs
        cout<<nodeTemp->data;
        cout<<nodePtr->data;
        cout<<nodeHead->data;
    }

    displayNode();
    system("pause>0");
}
 
void addNode(int num, int nodeSize){
    int i = 0;
    nodePtr = new Node;
    nodePtr->data = num;
    nodePtr->next = NULL;

    if (nodePtr->next == NULL){
        nodeHead = nodePtr;
        nodeTemp = nodePtr;
        nodePtr->next = nodeTemp;
    }
    else
        while(i<nodeSize){
            nodeTemp->next = nodeTemp;
        }
        nodeTemp->next = NULL;
}

void displayNode(){
    nodeTemp = new Node;
    nodeTemp = nodeHead;
    
    cout<<"The linked list: ";
    while(nodeTemp != NULL){
        cout<<nodeTemp->data<<" ";
        nodeTemp = nodeTemp->next;
    }
}

 

Однако код выводит только последнее введенное значение. Когда я проверил данные (см. строку 22,23,24), кажется, что указатель узла, температура и заголовок всегда имеют одинаковые значения. Я в замешательстве от того, в чем могут быть мои ошибки, и любая помощь была бы очень кстати.

Спасибо.

Комментарии:

1. Вы пробовали поместить это в отладчик(gdb) и проверить, что происходит в каждой строке AddNode? Я вижу проблему в этом методе.

2. К вашему сведению, nodeTemp = new Node; nodeTemp = nodeHead; = утечка памяти в двух строках. Это не Java. Вам не нужно все менять.

Ответ №1:

Вам не нужно передавать переменную размера в функцию AddNode. Просто возьмите значения, сколько хотите, в основной функции и передайте их в функцию AddNode, выполнив цикл до нужного размера, затем добавьте узлы в список, как обычно. Ваш код будет выглядеть примерно так:

 #include <iostream>
using namespace std;

struct Node{
    int data;
    int nodeNumber;
    Node *next;
};
Node *nodeHead=NULL;

void addNode (int num);
void displayNode();

int main(){
    int size, value;

    cout<<"Enter number of Nodes: ";
    cin>>size;

    for (int i=0; i<size; i  ){
        cin>>value;
        addNode(value);
    }

    displayNode();
    system("pause>0");
}
 
void addNode(int num){
    Node *tail = nodeHead;
    Node *nodePtr = new Node;
    nodePtr->data = num;
    nodePtr->next = NULL;

    if (nodeHead == NULL){
        nodeHead = nodePtr;
    }
    else{
        while(tail->next != NULL){
            tail = tail->next;
        }
        tail->next = nodePtr;
    }
}

void displayNode(){
    Node *nodeTemp = new Node;
    nodeTemp = nodeHead;
    
    cout<<"The linked list: ";
    while(nodeTemp != NULL){
        cout<<nodeTemp->data<<" ";
        nodeTemp = nodeTemp->next;
    }
}
 

Ответ №2:

нет необходимости в size переменной, когда вы вставляете узел в конце списка.

измените свою функцию, как показано ниже:

 void addNode(int num){
    nodePtr = new Node;
    nodePtr->data = num;
    nodePtr->next = NULL;
    /* if head is null, or list is empty! */
    if (nodeHead == NULL){
        nodeHead = nodePtr;
    }
    else{
        /* traverse the list to the end and add node at the NULL position */
        /* create a chain of nodeHead to nodeTemp */
        nodeTemp = nodeHead;
        while(nodeTemp-> next != NULL){
            nodeTemp = nodeTemp->next;
        }
        nodeTemp->next = nodePtr;
    }
}