gpt4 book ai didi

c - 如何删除循环链表中的所有数据?

转载 作者:行者123 更新时间:2023-11-30 16:32:17 25 4
gpt4 key购买 nike

 #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.txt172 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

这是我在使用删除功能后使用反向功能时的结果。

enter image description here

这张图片是我想要的结果。

最佳答案

您可以修改 delete_node 函数,使其在找到并删除节点时返回 1,在其他情况下返回 0。

删除所有 172 个节点将很容易:

while (delete_node(&list, delete_data) == 1);

备注:我没有将完整代码放在这里,因为 delete_node 函数存在一些问题,而问题与此无关。但你应该首先纠正它们以使一切正常工作。例如,如果您删除单个节点的列表,它将删除该节点,无论其数据是什么。

关于c - 如何删除循环链表中的所有数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50232406/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com