我用以下代码写了一个链表。第一次打印正在工作,但第二次打印不工作。
int main() {
Node *A, *B;
B = InsertTail(B, 2);
B = InsertTail(B, 3);
B = InsertTail(B, 8);
B = InsertTail(B, 10);
Print(B);
A = InsertTail(A, 1);
A = InsertTail(A, 5);
A = InsertTail(A, 10);
A = InsertTail(A, 12);
A = InsertTail(A, 16);
Print(A);
return 0;
}
函数InsertTail
将第二个参数中的数据插入到列表的末尾,并返回列表的head
。如果所有元素都有Print
函数打印列表。
打印功能实现为
void Print(Node *head)
{
Node *current = head;
if(head == NULL){ return; }
while(current != NULL){
cout << current->data << endl;
current = current->next;
}
}
而且,InsertTail is implemented as
Node* InsertTail(Node *head,int data)
{
Node *current = new Node, *temp = head;
current->data = data;
current->next = NULL;
if(temp==NULL){return current;}
else{
while(temp->next != NULL){ temp=temp->next;}
temp->next = current;
}
return head;
}
我尝试调试它,A
的第一个值很好,但在第二个值上,有data = 1836017711
。这是一个截图。
答案 0 :(得分:1)
您应该使用NULL初始化列表,同时使用garbage初始化它们:
Node *A, *B;
应该是
Node *A=NULL, *B=NULL;
答案 1 :(得分:1)
在调用之前,您似乎既没有A
也没有初始化B
。根据您的Print
函数判断,我认为应使用A
初始化B
和NULL
:
Node *A=NULL, *B=NULL;
没有初始化,我猜这是未定义的行为,任何事情都可能发生。在最简单的情况下,A
和B
碰巧指向内存中随机内容的随机位置(并且您很幸运能够B
工作)。
P.S。为什么要在尾部插入,但只保留指向头部的指针?我建议你保留一个指向尾巴的指针,这样你就不会每次都列出所有列表。