【数据结构】设单链表中的数据元素递增排列,删除表中所有大于min且小于max的元素(用户输入),同时释放被删除节点的空间。

题目: 设单链表中的数据元素递增排列,设计一个算法,删除表中所有大于min且小于max的元素,同时释放被删除节点的空间,并设计算法的时间复杂度。

来源:周桂红,等老师编写的数据结构第五十九页第二题

#include <stdio.h>
#include <stdlib.h>

typedef struct Node
{
    int data;
    struct Node *next;
}node;//定义一个结构体node

node *init();
void output(node *head);
void delete_linklist(node *head, int min, int max);

node *init()//创建单链表,要求用户输入值
{
    node *head = NULL;
    node *p = NULL;
    node *s = NULL;
    int input, certain = 1, i = 0;
    head = (node *)malloc(sizeof(node));//定义头节点
    if(head == NULL)//如果申请的头节点失败
    {
        printf("sorry,申请空间失败!");
        exit(1);//说实话,这里我也不清楚为什么,借鉴小甲鱼(B站up主)的。
    }

    head->next = NULL;
    p = head;
    printf("您好,请输入数据,我们将会输入进去(记得由小往大),输入0结束!\n");
    while(certain)
    {
        i = i + 1;
        printf("请输入第%d个数字:", i);
        scanf("%d", &input);
        if(input != 0)
        {
            s = (node *)malloc(sizeof(node));
            if(s == NULL)
            {
                printf("sorry,申请空间失败!");
                exit(1);
            }
            s->data = input;
            p->next = s;
            p = p->next;
        }
        else
        {
            certain = 0;
        }
        p->next = NULL;
    }
    return head;
}

void output(node *head)//输出单链表里的数值
{
        node *p = head->next;
        while(p != NULL)
        {
            printf("%d ", p->data);
            p = p->next;
        }
        printf("\r\n");
}

void delete_linklist(node *head, int min, int max)//删除单链表里处于最值中间的数
{
    node *p = head->next;
    node *q;
    while(p != NULL)
    {
        if(p->data >= min && p->data <= max)
        {
            q->next = p->next;
            free(p);//这两行的意思是将我们找到的节点给释放
            p = q->next;
        }
        else
        {
            q = p;
            p = p->next;
        }
    }
}

int main()
{
    int min, max;
    node *head = NULL;
    head = init();

    printf("您输入的数据分别是:\n");
    output(head);
    printf("\n");
    printf("请分别输入最小值和最大值,我们会删除您所创建的单链表的二者中间的数据:");
    printf("最小值:");
    scanf("%d", &min);
    printf("最大值:");
    scanf("%d", &max);
    delete_linklist(head, min, max);

    printf("\n删除后的结果是:");

    node *p = head->next;//遍历输出,用函数会出现莫名的bug,应该是有野指针,但由于我也不会,所以只能遍历了
    while(p != NULL)
    {
        printf("%d ", p->data);
        p = p->next;
    }

    return 0;
}

 

posted @ 2022-03-20 22:07  炸天帮帮主  阅读(183)  评论(0编辑  收藏  举报