c - 无法从c中的循环链表中删除第一个元素
问题描述
假设列表中有 3 个元素(10 20 30)。现在在第一次删除元素时删除 10。现在只剩下 20 和 30。如果我再次删除第一个元素,那么 20 会从列表中删除。但是现在如果我尝试从列表中删除唯一的元素,即 30,它不会发生。
提前致谢。
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int data;
struct node *next;
} list;
list *start = NULL;
list *create(list *);
list *display(list *);
list *delete_beg(list *);
int main() {
int n;
printf("1: Create list\n");
printf("2: Display\n");
printf("3: Delete first element\n");
for (;;) {
printf("Enter your choice: ");
scanf("%d", &n);
switch (n) {
case 1:
start = create(start);
printf("\nList created successfully\n");
break;
case 2:
start = display(start);
break;
case 3:
start = delete_beg(start);
break;
default:
printf("Wrong input!!!");
exit(0);
}
}
}
list *create(list *start) {
list *new_node, *ptr;
int num;
printf("Enter data: ");
scanf("%d", &num);
new_node = (list *)malloc(sizeof(list));
new_node->data = num;
if (start == NULL) {
start = new_node;
new_node->next = start;
} else {
ptr = start;
while (ptr->next != start) {
ptr = ptr->next;
}
ptr->next = new_node;
new_node->next = start;
}
return start;
}
list *display(list *start) {
list *ptr;
if (start == NULL) {
printf("Empty list");
return start;
} else {
ptr = start;
while (ptr->next != start) {
printf("%d\n", ptr->data);
ptr = ptr->next;
}
printf("%d\n", ptr->data);
}
return start;
}
list *delete_beg(list *start) {
list *ptr;
if (start == NULL) {
printf("Empty list!!!");
return start;
} else {
ptr = start;
while (ptr->next != start)
ptr = ptr->next;
ptr->next = start->next;
free(start);
start = ptr->next;
return start;
}
}
解决方案
在函数delete_beg
中,当列表只包含一个将被删除的节点时,指针 start 永远不会设置为 NULL。
该函数可以通过以下方式定义
list *delete_beg(list *start) {
if (start == NULL) {
printf("Empty list!!!");
return start;
} else {
List *current = start;
List *ptr = start;
while (ptr->next != start)
ptr = ptr->next;
if ( ptr->next == ptr )
{
start = NULL;
}
else
{
start = start->next;
ptr->next = start;
}
free( current );
return start;
}
推荐阅读
- javascript - 如何在javascript对象中按键查找对象?
- android - Android Google Fit 无法读取血压值
- javascript - 使用 jQuery 中的 setInterval 方法从对象中填充数据
- php - 如何将日期解析为上个月的同一天?
- javascript - 在 GAS 上使用基本身份验证 API JSON 时出现错误 400
- raku - Perl6 中多种可能的输出类型
- c# - 如何在 TreeViewItem 的模板上使用 DataTemplateSelector?
- android - 如何解决链接文件资源失败的问题
- ios - Swift:firebase didRegisterForRemoteNotificationsWithDeviceToken 在某些设备上不起作用
- javascript - 如何保持显示当前页面直到下一页数据完全加载然后显示下一页而不刷新当前页面?