我不明白为什么display()func只显示列表的第一个成员。我觉得我的指针搞得一团糟,但我无法理解。我将其与其他链表源进行了比较,似乎该函数是以良好的方式编写的。
#include "stdafx.h"
#include <string>
#include <iostream>
using namespace std;
struct Node
{
int Data;
Node * next;
};
void initNode(struct Node *head,int n);
void AddNode(int n,Node* head);
void display(Node* head);
int main()
{
Node * head = new Node;
initNode(head,5);
display(head);
AddNode(10,head);
display(head);
AddNode(15,head);
display(head);
cin.get();
return 0;
}
void AddNode(int n,Node * head)
{
Node * node = new Node;
node->Data = n;
node->next = NULL;
Node * nextNode = head;
while(nextNode)
{
if(nextNode->next == NULL)
{
nextNode->next = node;
}
nextNode = nextNode->next;
}
}
void display(Node * head)
{
while(head)
{
cout << head->Data << " "<<endl;
head = head->next;
}
}
void initNode(struct Node *head,int n)
{
head->Data = n;
head->next = NULL;
}
答案 0 :(得分:2)
您的AddNode
方法过于复杂。做这样的事情要添加到前面:
Node *AddNode(int n, Node *head)
{
Node *newNode = new Node;
newNode->Data = n;
newNode->next = head;
return newNode;
}
或者添加到最后:
Node *AddNode(int n, Node *head)
{
Node *newNode = new Node;
newNode->Data = n;
newNode->next = NULL;
if(head == NULL) return newNode;
Node *current = head;
while(current->Next != NULL)
{
current = current->Next;
}
current->Next = newNode;
return head;
}
以这种方式AddNode
,您不需要initNode
。现在你可以一天:
Node *head = NULL;
head = AddNode(5, head);
head = AddNode(10, head);
head = AddNode(15, head);
display(head);
此外,您不需要在C ++中说struct Node
,只在C中需要它。
答案 1 :(得分:2)
函数AddNode具有无限循环。
void AddNode(int n,Node * head)
{
Node * node = new Node;
node->Data = n;
node->next = NULL;
Node * nextNode = head;
while(nextNode)
{
if(nextNode->next == NULL)
{
nextNode->next = node;
}
nextNode = nextNode->next;
}
}
假设您只有一个元素是头(在调用initNode之后)。结果是head-&gt; next = NULL。因此,在循环体内进行分配
nextNode->next = node;
现在head-&gt; next不等于NULL。所以在声明之后
nextNode = nextNode->next;
nextNode可以使用新元素。因为它不等于NULL,所以将重复循环的迭代。同样对于新节点,其数据成员next等于NULL。然后你自己添加它。
现在,列表中没有任何元素会使数据成员接下来等于NULL。因此您无法添加新元素。最后一个元素包含对自身的引用。 你可以用以下方式编写函数
void AddNode(int n,Node * head)
{
Node * node = new Node;
node->Data = n;
node->next = NULL;
Node * nextNode = head;
while( nextNode -> next ) nextNode = nextNode->next;
nextNode->next = node;
}
但是考虑到假设head不等于NULL。否则该功能将不正确。我认为你应该重新设计你的名单。
答案 2 :(得分:1)
在AddNode
函数中,在if块中添加一个中断。
void AddNode(int n,Node * head)
{
Node * node = new Node;
node->Data = n;
node->next = NULL;
Node * nextNode = head;
while(nextNode)
{
if(nextNode->next == NULL)
{
nextNode->next = node;
break;
}
nextNode = nextNode->next;
}
}
现在它应该正确添加。
答案 3 :(得分:0)
Node * nextNode = head;
while(nextNode)
{
if(nextNode->next == NULL)
{
nextNode->next = node;
}
nextNode = nextNode->next;
}
问题在于这段代码。当您找到列表的末尾(如果nextNode-&gt; next == NULL)时,您需要突破循环。试着用一个例子来说服自己。
答案 4 :(得分:0)
每次添加节点时,都会从头部遍历到列表末尾 您可以按如下方式更改
void AddNode(int n){
Node *node=new Node;
node->data=n;
node->next=NULL; //head is global
if(head==NULL){
t=head=n;
}
else{
t->next=n; //t is global
t=t->next;
}
}