首页 > 解决方案 > 如何删除循环链表中的所有数据?

问题描述

 #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

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

在此处输入图像描述

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

标签: cdata-structureslinked-list

解决方案


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

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

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

备注:我没有把整个代码放在这里,因为delete_node函数中存在一些问题,问题不在于那个。但是您应该首先纠正它们以使一切正常。例如,如果您在单个节点的列表中删除,无论其数据是什么,它都会删除该节点。


推荐阅读