我是一个刚开始接触链表的程序员。
我目前正试图找出一个功能,从"播放列表"中删除歌曲(节点);(链表)。每个节点有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;
}
}
输入文件:
- 拉赫玛尼诺夫协奏曲_no_2 1999
- 莫扎特交响曲_no_41 2000
- 维瓦尔第的季节2003
- 贝多芬交响曲第5交响曲1994
- Bach Toccatas 2005
这是控制台输出:
你想借哪首歌?(标题):托卡塔
- 成功!托卡塔斯在名单上。借款…
- 新列表:
- 拉赫玛尼诺夫,第2号协奏曲,1999
- 莫扎特,交响曲no . 41, 2000
- 维瓦尔第,季节,2003
- 贝多芬1994年第五交响曲
- >
还在研究指针,我想我们都从某个地方开始: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
,它将始终是头部元素。