我正在visual studio中用c++编写一些代码,这是一个有序的链表,但指针有点问题。
我有三种不同的方法/功能来完成这项任务。
/*
* insert_head: Insert a node at the beginning of the list.
*/
book *inserta_head(book *head, book *newNode){
newNode->next = head;
return newNode;
}
/*
* insert_after: Insert a new node after another one.
*/
void insert_after(book *node, book *newNode){
newNode->next = node->next;
node->next = newNode;
}
/*
* insert: Adds a new node (ordered by code) to the list.
*/
void insert(book* head, int code, char name[40], char lastName[40], char title[40], int year, int lend) {
book* newNode = crear_libro(code, name, lastName, title, year, lend);
book* aux = head;
// If the list is empty.
if (head == NULL){
head = insert_head(head, newNode);
} else {
// If the new node goes before the head.
if (aux->code > newNode->code){
head = insert_head(head,newNode);
} else {
while (aux != nullptr && aux->code < newNode->code)
aux = aux->next;
// Verify the code isn't repeated
if (aux != nullptr && aux->code == newNode->code){
printf("Error: Verify the code. n");
} else {
insert_after(aux,newNode);
}
}
}
}
我试过运行代码。每次我试着打印列表时,它都说它是空的。我已经检查了我的打印方法和创建节点的方法,它们都在工作,所以我很确定它与指针有关,但我找不到错误。
insert
函数更改head
指针。但该指针是调用函数时使用的头指针的副本。因此insert
函数外的头指针保持不变。这就是为什么列表中没有添加任何内容的原因。
一个简单的修复方法是将head
参数作为参考。
void insert(book*& head, int code, ...
问题在于如何处理头部。
此行之后:
head = insert_head(head, newNode);
函数中的头应该是正确的(用调试器仔细检查(。但是,调用者中的头将保持不变。这是因为您不会更改现有头中的数据,而是创建了一个新头。
一个简单的修复方法是将指针指向指向头的指针。book** head
通过这种方式,您也可以更改调用程序中的指针(在修复所有编译错误之后(。