打印元素两个链表表现得很奇怪

时间:2015-06-16 14:46:45

标签: c++ pointers

我用以下代码写了一个链表。第一次打印正在工作,但第二次打印不工作。

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。这是一个截图。 enter image description here

2 个答案:

答案 0 :(得分:1)

您应该使用NULL初始化列表,同时使用garbage初始化它们:

Node *A, *B;

应该是

Node *A=NULL, *B=NULL;

答案 1 :(得分:1)

在调用之前,您似乎既没有A也没有初始化B。根据您的Print函数判断,我认为应使用A初始化BNULL

Node *A=NULL, *B=NULL;

没有初始化,我猜这是未定义的行为,任何事情都可能发生。在最简单的情况下,AB碰巧指向内存中随机内容的随机位置(并且您很幸运能够B工作)。

P.S。为什么要在尾部插入,但只保留指向头部的指针?我建议你保留一个指向尾巴的指针,这样你就不会每次都列出所有列表。