我的程序应该创建一个链表并显示它。我的问题是,当addelemnt_end函数结束时,它不会更新head
和last
。
我尝试使用调试,当我的功能完成时,信息和头部和最后一部分的下一部分是“无法读取内存”。
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;
}
答案 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;
}
}