在C++中的有序链表中插入一个新节点



我正在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通过这种方式,您也可以更改调用程序中的指针(在修复所有编译错误之后(。

相关内容

  • 没有找到相关文章

最新更新