退出函数后,节点不会保存

时间:2013-12-21 15:43:22

标签: c++ nodes

我的程序应该创建一个链表并显示它。我的问题是,当addelemnt_end函数结束时,它不会更新headlast
我尝试使用调试,当我的功能完成时,信息和头部和最后一部分的下一部分是“无法读取内存”。

struct node{
int info;
node *next;
};

node *head, *last;

void addelement_end(node *head, node *last, int element)
{if (head == NULL)
    {   node *temp = new node;
        temp->info = element;
        temp->next = NULL;
        last = temp;
        head = temp;

    }
    else {node*temp = new node;
        last->next = temp;
        temp->info = element;
        temp->next = NULL;
        last = temp;
    }
}
void show(node* head, node *last)
{


if (head==NULL)
        cout << "Empty list";

    else
    while (head != NULL)
    {
        cout << head->info << " ";
        head = head->next;
    }

}

int _tmain(int argc, _TCHAR* argv[])
{

int x, n, i;
cout << "how many numbers";
    cin >> n;

head = last = NULL;
for (i =1; i <= n; i++)
{
    cin >> x;
    addelement_end(head, last, x);

}
show(head, last);

return 0;
}

1 个答案:

答案 0 :(得分:2)

这是一个非常常见的错误。以下是该问题的类似说明:

int change_a(int a) {
    a = 42;
}

int main() {
    int a = 10;
    change_a(a);
    printf("%d\n", a);
    return 0;
}

这将打印10,因为在函数change_a中,您只修改变量a中包含的值的副本。

正确的解决方案是传递指针(或使用引用,因为您使用的是C ++)。

int change_a(int *a) {
    *a = 42;
}

int main() {
    int a = 10;
    change_a(&a);
    printf("%d\n", a);
    return 0;
}

但也许你会告诉我:“我已经在使用指针!”。是的,但指针只是一个变量。如果要更改指针指向的位置,则需要将指针传递给该指针。

所以,试试这个:

void addelement_end(node **head, node **last, int element)
{
    if (*head == NULL)
    {   node *temp = new node;
        temp->info = element;
        temp->next = NULL;
        *last = temp;
        *head = temp;
    }
    else {
        node *temp = new node;
        (*last)->next = temp;
        temp->info = element;
        temp->next = NULL;
        *last = temp;
    }
}