c - 如何删除循环链表中的所有数据?
问题描述
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
typedef struct ListNode
{
int data;
struct ListNode *link;
} ListNode;
typedef struct List
{
ListNode *head;
ListNode *tail;
} List;
void list_init(List *header)
{
header->head = NULL;
header->tail = NULL;
}
void insert_node(List *header, int data)
{
ListNode *new_node = (ListNode *)malloc(sizeof(ListNode));
if (header->head == NULL)
{
header->head = new_node;
header->tail = new_node;
new_node->data = data;
new_node->link = header->tail;
return;
}
if (header->head != NULL)
{
new_node->link = header->head;
new_node->data = data;
header->head = new_node;
header->tail->link = header->head;
return;
}
}
void delete_node(List *header, int key)
{
if (header->head == NULL)
return;
ListNode *curr = header->head;
ListNode *prev;
while (curr->data != key)
{
if (curr->link == header->head)
break;
prev = curr;
curr = curr->link;
}
if (curr->link == header->head)
{
header->head = NULL;
free(curr);
return;
}
if (curr == header->head)
{
prev = header->head;
while (prev->link != header->head)
prev = prev->link;
header->head = curr->link;
prev->link = header->head;
free(curr);
return;
}
else if (curr->link == header->head)
{
prev->link = header->head;
free(curr);
return;
}
else
{
prev->link = curr->link;
free(curr);
return;
}
}
List *reverse(List *header)
{
ListNode *p, *q, *r;
if (header->head->link == header->head || header->head == NULL)
return header;
p = header->head->link;
q = header->head;
while (p != header->head)
{
r = q;
q = p;
p = p->link;
q->link = r;
}
header->head = q;
header->tail = p;
p->link = q;
return header;
}
void display(List *header)
{
ListNode *cur = header->head;
printf("< ");
do
{
printf("%d ", cur->data);
cur = cur->link;
} while (cur != header->head);
printf(">\n");
printf("Head : %d\n", header->head->data);
printf("Tail : %d\n", header->tail->data);
printf("Tail Next : %d\n", header->tail->link->data);
}
int main()
{
List list;
int data, delete_data = 172;
int num_of_data = 0, i;
list_init(&list);
FILE *fp = fopen("data2.txt", "r");
if (fp == NULL)
{
printf("FILE OPEN ERROR!\n");
return 0;
}
while (!feof(fp))
{
fscanf(fp, "%d", &data);
insert_node(&list, data);
num_of_data++;
}
display(&list);
printf("\n");
reverse(&list);
delete_node(&list, delete_data);
printf("< Delete %d >\n", delete_data);
printf("< Reverse >\n\n");
display(&list);
return 0;
}
数据2.txt 172 473 273 584 182 584 172 734 162 372 574 964 543 372 172
我想删除所有 172 号数据。
如何更改函数 delete_node?
如何使用 delete_node 创建新功能?
< 172 473 273 584 182 584 172 734 162 372 574 964 543 372 172 >
头:172
尾巴:172
尾巴下一个:172
< 删除 172 >
< 反向 >
< 473 273 584 182 584 734 162 372 574 964 543 372 >
头:473
尾巴:372
尾巴下一个:473
这是我使用删除功能时的结果。
< 372 543 964 574 372 162 734 584 182 584 273 473 >
头:372
尾巴:473
尾巴下一个:372
这是我在使用删除功能后使用反向功能时的结果。
这张图片是我想要的结果。
解决方案
delete_node
如果找到并删除了节点,您可以修改函数以返回 1,而在其他情况下返回 0。
删除所有 172 个节点将很容易:
while (delete_node(&list, delete_data) == 1);
备注:我没有把整个代码放在这里,因为delete_node
函数中存在一些问题,问题不在于那个。但是您应该首先纠正它们以使一切正常。例如,如果您在单个节点的列表中删除,无论其数据是什么,它都会删除该节点。
推荐阅读
- python - 从数据框列中获取某些值并在 python 中创建新的数据框
- c++ - ubuntu 上的静态链接 pthread 导致未初始化的值跳转(valgrind)
- android-studio - 截取android中矩形包围的部分视图
- python - 如何在 django 中获取按钮单击时的输入值
- python - 在没有用户命令的情况下使用 python 电报机器人发送消息?
- java - SonarQube 错误:方法从没有历史记录的 catch 块中抛出替代异常
- amazon-s3 - AWS MediaConvert 为 Safari 录制的视频引发错误 1076
- javascript - 如何编写一个将我的数据与一个单词连接起来的循环?
- joomla - configuration.php 在 joomla 安装时消失
- python - 将数据框列转换为具有布尔值 Pandas 的多列