根据其内容从双向链表中删除结构(在 C 中)
Deleting a structure from a doubly linked list based on its contents (in C)
我的程序是一个基本的 C 接口,允许用户输入、向前打印、向后打印以及从列表中删除 MP3 记录。该列表在 C 语言中实现为 MP3 结构的双向链表。
除删除外,我的所有功能都可以正常工作。 Delete 接受一个指向列表头节点的指针和一个字符串,表示您要删除哪个艺术家的记录。在我的 main 中,我记录了用户输入并验证了它被正确记录。然后我将用户输入和头部引用传递到以下函数中以删除所述 MP3 记录。但是,我的程序可以正常构建和执行,但在调用删除函数时实际上并没有删除任何记录。任何帮助表示赞赏。
为清楚起见,我查看了关于从 DLL 中删除节点的堆栈上的多个问题,但是它们都是关于保存整数值的简单 DLL,并且似乎不能很好地转换为我的场景。如果这被认为是重复的问题,我深表歉意,如果是这样,请指出我正在重复的问题。再次感谢您提供的所有帮助。下面是我的函数
void deleteMP3(struct MP3* head_ref, char* artist)
{
//Declaring a temp struct to hold the node that needs to be deleted
struct MP3* temp;
//Check if the head node contains the artist to be deleted
if(head_ref->artist == artist)
{
//Set temp to the current head ref so it can be deleted
temp = head_ref;
//Set head_ref to the next node in the list
head_ref = head_ref->next;
//Free the memory associated with the MP3 to be deleted
free(temp->artist);
free(temp->title);
free(temp->date);
free(temp);
}
//Traverse the list checking each MP3's artist field
while(head_ref != NULL)
{
//Check the artist of the current MP3 against the input. Delete it if it needs to be deleted
if(head_ref->artist == artist)
{
//Set temp to the current MP3
temp = head_ref;
//Check if the MP3 is the last MP3. If not, change the field of the next node in the list
if(head_ref->next != NULL)
{
//Sets the previous field of the next node in the list to the previous field of the node to be deleted
head_ref->next->prev = head_ref->prev;
}
//Change the next pointer of the previous MP3 in the list to the MP3 following the one to be deleted
head_ref->prev->next = head_ref->next;
//Free the memory
free(temp->artist);
free(temp->title);
free(temp->date);
free(temp);
}
//Traverse forward
head_ref = head_ref->next;
}
}
代码中存在一些问题,但以下两个是最关键的问题:
1.) 使用strcmp
比较字符串。 head_ref->artist == artist
比较指针,而不是内容,通常不太可能传入 DLL 元素指向的同一指针。
2.) 如果head被删除,需要将"new" head传回给deleteMP3
的调用者;否则传递给 deleteMP3
的变量仍将包含指向(已删除)节点的指针。因此,将 void deleteMP3(struct MP3* head_ref, char* artist)
更改为 struct MP3 *deleteMP3(struct MP3* head_ref, char* artist)
和 return DLL 的实际头部(无论更改与否)。
我的程序是一个基本的 C 接口,允许用户输入、向前打印、向后打印以及从列表中删除 MP3 记录。该列表在 C 语言中实现为 MP3 结构的双向链表。
除删除外,我的所有功能都可以正常工作。 Delete 接受一个指向列表头节点的指针和一个字符串,表示您要删除哪个艺术家的记录。在我的 main 中,我记录了用户输入并验证了它被正确记录。然后我将用户输入和头部引用传递到以下函数中以删除所述 MP3 记录。但是,我的程序可以正常构建和执行,但在调用删除函数时实际上并没有删除任何记录。任何帮助表示赞赏。
为清楚起见,我查看了关于从 DLL 中删除节点的堆栈上的多个问题,但是它们都是关于保存整数值的简单 DLL,并且似乎不能很好地转换为我的场景。如果这被认为是重复的问题,我深表歉意,如果是这样,请指出我正在重复的问题。再次感谢您提供的所有帮助。下面是我的函数
void deleteMP3(struct MP3* head_ref, char* artist)
{
//Declaring a temp struct to hold the node that needs to be deleted
struct MP3* temp;
//Check if the head node contains the artist to be deleted
if(head_ref->artist == artist)
{
//Set temp to the current head ref so it can be deleted
temp = head_ref;
//Set head_ref to the next node in the list
head_ref = head_ref->next;
//Free the memory associated with the MP3 to be deleted
free(temp->artist);
free(temp->title);
free(temp->date);
free(temp);
}
//Traverse the list checking each MP3's artist field
while(head_ref != NULL)
{
//Check the artist of the current MP3 against the input. Delete it if it needs to be deleted
if(head_ref->artist == artist)
{
//Set temp to the current MP3
temp = head_ref;
//Check if the MP3 is the last MP3. If not, change the field of the next node in the list
if(head_ref->next != NULL)
{
//Sets the previous field of the next node in the list to the previous field of the node to be deleted
head_ref->next->prev = head_ref->prev;
}
//Change the next pointer of the previous MP3 in the list to the MP3 following the one to be deleted
head_ref->prev->next = head_ref->next;
//Free the memory
free(temp->artist);
free(temp->title);
free(temp->date);
free(temp);
}
//Traverse forward
head_ref = head_ref->next;
}
}
代码中存在一些问题,但以下两个是最关键的问题:
1.) 使用strcmp
比较字符串。 head_ref->artist == artist
比较指针,而不是内容,通常不太可能传入 DLL 元素指向的同一指针。
2.) 如果head被删除,需要将"new" head传回给deleteMP3
的调用者;否则传递给 deleteMP3
的变量仍将包含指向(已删除)节点的指针。因此,将 void deleteMP3(struct MP3* head_ref, char* artist)
更改为 struct MP3 *deleteMP3(struct MP3* head_ref, char* artist)
和 return DLL 的实际头部(无论更改与否)。