小白学Java# 2022-10-25 19:45 采纳率: 0%
浏览 12
已结题

哪位可以帮助一下下呢

输入30个数据,生成一个按递增顺序排列的单链表,删除链表中大于A且小于B的节点,并返回这些节点值。A,B值可根据自己输入的数据确定。

  • 写回答

1条回答 默认 最新

  • .LAL. C/C++领域新星创作者 2022-10-25 20:06
    关注
    
    #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;
    }
    
    
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月12日
  • 创建了问题 10月25日

悬赏问题

  • ¥20 ARKts悬浮窗和快捷方式问题
  • ¥15 comparecluster没有办法kegg
  • ¥15 远程访问linux主机超时
  • ¥15 odoo17存货管理优势于中国国内该行业传统ERP或MES的详细解读和举例
  • ¥15 CPU卡指令整合指令数据都在图片上
  • ¥15 odoo17处理受托加工产品
  • ¥15 如何用MATLAB编码图三的积分
  • ¥15 圆孔衍射光强随孔径变化
  • ¥15 MacBook pro m3max上用vscode运行c语言没有反应
  • ¥15 ESP-PROG配置错误,ALL ONES