#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;
}
}