C语言 为什么这个函数不删除节点?



我是一个刚开始接触链表的程序员。

我目前正试图找出一个功能,从"播放列表"中删除歌曲(节点);(链表)。每个节点有3个数据点,2个字符串(艺术家和标题)和1个整数(发行年份)。有没有人能帮我弄清楚我做错了什么,我该怎么做?

功能:

struct Node *borrow_song(struct Node *pointer) {

struct Node *temp = pointer;
char response[40];
struct Node *remove;
printf("Which song do you want to borrow? (title): ");
scanf(" %s", response);

while(temp != NULL) {

remove = temp;

if (strcmp(response, temp->title) == 0) {

printf("nSuccess! %s is in the list. Borrowing..n", response);

free(remove); // I have a feeling this isn't how you properly free a node.
remove = NULL;

return 0;

}

else 
temp = temp->next;

}
printf("%s was not in the list... Try again.", response);
return 0;
}

司机:

switch....
case 4:
borrow_song(head);
printf("nNew list:nn");
print_list(head);

一个慷慨的人在这里创建节点的函数(从。txt文件创建节点)

struct Node *read_node(FILE *inputp) {
struct Node *temp = malloc(sizeof(*temp));

if (temp != NULL &&  fscanf(inputp, "%39s%39s%d", &temp->name, &temp->title, &temp->year) == 3) {
temp->next = NULL;
temp->prev = NULL;
return temp;
} 
else {
free(temp);
return NULL;
}
}

最后,驱动程序:

while ((node = read_node(inputp)) != NULL) {

if (!head) {

head = tail = node;

} 

else {

node->prev = tail;
tail = tail->next = node;

}
}

输入文件:

  1. 拉赫玛尼诺夫协奏曲_no_2 1999
  2. 莫扎特交响曲_no_41 2000
  3. 维瓦尔第的季节2003
  4. 贝多芬交响曲第5交响曲1994
  5. Bach Toccatas 2005

这是控制台输出:

你想借哪首歌?(标题):托卡塔

  1. 成功!托卡塔斯在名单上。借款…
  2. 新列表:
  3. 拉赫玛尼诺夫,第2号协奏曲,1999
  4. 莫扎特,交响曲no . 41, 2000
  5. 维瓦尔第,季节,2003
  6. 贝多芬1994年第五交响曲
  7. >

还在研究指针,我想我们都从某个地方开始:p

谢谢你的帮助!

您需要通过将前一个节点的next指针设置为指向被删除节点之后的节点来取消该节点的链接。如果要删除的节点是列表中的第一个节点,则没有前一个节点,因此需要允许更改列表的头部,可能通过始终返回指向头部元素的指针(如果查看返回类型,这似乎是预期的!)。

最统一的方法是将Node **next_ptr初始设置为&pointer。在循环中,设置Node *temp = *next_ptr,看看是否要移除temp节点。如果是,设置*next_ptr = temp->next,释放temp,返回pointer。如果没有,设置next_ptr = &temp->next并再次循环。如果是temp == NULL,则没有找到节点,应该返回pointer。这样,如果要删除的节点是第一个节点,那么就更新了pointer,否则就更新了前一个节点的next。无论哪种方式,您总是返回pointer,它将始终是头部元素。

相关内容

  • 没有找到相关文章

最新更新