Gee. 2022-06-01 23:07 采纳率: 53.3%
浏览 61
已结题

单链表删除min和max之间的元素,但是删除不了

问题遇到的现象和发生背景

单链表删除min和max之间的元素

问题相关代码,请勿粘贴截图

#include <stdio.h>
#include<stdlib.h>
#include <malloc.h>
typedef int DataType;
typedef struct Lnode
{
DataType data;
struct Lnode* next;
}LinkList;
void Initlist(LinkList*& L)
{
L = (LinkList*)malloc(sizeof(LinkList));
L->next = NULL;
}
void DestroyList(LinkList* L)
{
LinkList* p = L, * q = L->next;
while (q != NULL)
{
free(p);
p = q;
q = p->next;
}
free(p);
}
void Listempty(LinkList* L)
{
if (L->next == NULL)
printf("链表为空");
else
printf("链表不为空");
}
int Listlength(LinkList* L)
{
LinkList* p = L;
int i = 0;
while (p->next != NULL)
{
i++;
p = p->next;
}
return i;
}
void output(LinkList* L)
{
LinkList* p = L->next;
while (p->next != NULL)
{
printf("%c ", p->data);
p = p->next;
}
printf("%c ", p->data);
printf("\n");
}
int Getdata(LinkList* L, int i, DataType x)
{
LinkList* p = L;
int j = 0;
while (p != NULL && j < i - 1)
{
j++;
p = p->next;
}
if (p == NULL)
{
printf("non-existent\n");
return 0;
}
else
{
x = p->data;
return x;
}
}
int Locatedata(LinkList* L, DataType x)
{
LinkList* p = L;
int j = 0;
while (p != NULL && p->data != x)
{
j++;
p = p->next;
}
if (p == NULL)
{
printf("NOt Found!\n");
return 0;
}
else
return(j);
}

int Insertdata(LinkList* L, int i, DataType x)
{
LinkList* p = L, * s;
int j = 0;
while (p != NULL && j < i - 1)
{
j++;
p = p->next;
}
if (p == NULL)
{
printf("Place is wrong");
return 0;
}
else
{
s = (LinkList*)malloc(sizeof(LinkList));
s->data = x;
s->next = p->next;
p->next = s;
return 1;
}
}

void deletes(LinkList* L, int min, int max)
{

    LinkList* p, * q, * tmp;
    p = L;
    q = L->next;
    while (q != NULL && q->data <= min)
    {
        p = q; q = q->next;
    }
    while (q != NULL && q->data < max)
    {
        tmp = q;
        p->next = q->next;
        q = q->next;
        free(tmp);
    }

}

int main()
{

int a = 0, b = 0;
LinkList* L;
DataType x;
printf("(1)初始化单链表:\n");
Initlist(L);
printf("(2)依次采用尾插法插入元素:\n");
Insertdata(L, 1, '1');
Insertdata(L, 2, '2');
Insertdata(L, 3, '3');
Insertdata(L, 4, '4');
Insertdata(L, 5, '5');
Insertdata(L, 6, '6');
Insertdata(L, 7, '7');
Insertdata(L, 8, '8');
Insertdata(L, 9, '9');
printf("\n");
printf("(3)输出单链表:\n");
output(L);
printf("(4)输入min和max:");
scanf_s("%d,%d", &a, &b);
printf("\n");
deletes(L, a, b);
printf("(5)处理后的单链表:");
output(L);
printf("\n");

}

运行结果及报错内容

运行结果是没有丝毫变化,单链表的初始化是怎样的,最后输出也是怎样的

img

我的解答思路和尝试过的方法
我想要达到的结果

删除表中值大于min且小于max的结点,同时释放被删除的结点空间,min和max通过参数给定

  • 写回答

2条回答 默认 最新

  • qzjhjxj 2022-06-02 09:47
    关注

    把链表数据单元的数据类型搞错了,所以删不了,修改处见注释,供参考:

    #include <stdio.h>
    #include<stdlib.h>
    #include <malloc.h>
    typedef int DataType; //这里定义的是 int 型 
    typedef struct Lnode
    {
        DataType data;
        struct Lnode* next;
    }LinkList;
    void Initlist(LinkList*& L)
    {
        L = (LinkList*)malloc(sizeof(LinkList));
        L->next = NULL;
    }
    void DestroyList(LinkList* L)
    {
        LinkList* p = L, * q = L->next;
        while (q != NULL)
        {
            free(p);
            p = q;
            q = p->next;
        }
        free(p);
    }
    void Listempty(LinkList* L)
    {
        if (L->next == NULL)
            printf("链表为空");
        else
            printf("链表不为空");
    }
    int Listlength(LinkList* L)
    {
        LinkList* p = L;
        int i = 0;
        while (p->next != NULL)
        {
            i++;
            p = p->next;
        }
        return i;
    }
    void output(LinkList* L)
    {
        LinkList* p = L->next;
        while (p != NULL) //while (p->next != NULL)修改
        {
            printf("%d ", p->data); //修改 输出 %d
            p = p->next;
        }
        //printf("%c ", p->data); //修改
        printf("\n");
    }
    int Getdata(LinkList* L, int i, DataType x)
    {
        LinkList* p = L;
        int j = 0;
        while (p != NULL && j < i - 1)
        {
            j++;
            p = p->next;
        }
        if (p == NULL)
        {
            printf("non-existent\n");
            return 0;
        }
        else
        {
            x = p->data;
            return x;
        }
    }
    int Locatedata(LinkList* L, DataType x)
    {
        LinkList* p = L;
        int j = 0;
        while (p != NULL && p->data != x)
        {
            j++;
            p = p->next;
        }
        if (p == NULL)
        {
            printf("NOt Found!\n");
            return 0;
        }
        else
            return(j);
    }
    
    int Insertdata(LinkList* L, int i, DataType x)
    {
        LinkList* p = L, * s;
        int j = 0;
        while (p != NULL && j < i - 1)
        {
            j++;
            p = p->next;
        }
        if (p == NULL)
        {
            printf("Place is wrong");
            return 0;
        }
        else
        {
            s = (LinkList*)malloc(sizeof(LinkList));
            s->data = x;
            s->next = p->next;
            p->next = s;
            return 1;
        }
    }
    
    void deletes(LinkList* L, int min, int max)
    {
        LinkList* p, * q, * tmp;
        p = L;
        q = L->next;
        while (q != NULL && q->data <= min)
        {
            p = q; q = q->next;
        }
        while (q != NULL && q->data < max) 
        {
            tmp = q;
            p->next = q->next;
            q = q->next; 
            free(tmp);
        }
    }
    
    int main()
    {
        int a = 0, b = 0;
        LinkList* L;
        DataType x;
        printf("(1)初始化单链表:\n");
        Initlist(L);
        printf("(2)依次采用尾插法插入元素:\n");
        Insertdata(L, 1, 1); //这里数据类型应该是数值,不是字符'1'
        Insertdata(L, 2, 2);//'2'
        Insertdata(L, 3, 3);//'3'
        Insertdata(L, 4, 4);//'4'
        Insertdata(L, 5, 5);//'5'
        Insertdata(L, 6, 6);//'6'
        Insertdata(L, 7, 7);//'7'
        Insertdata(L, 8, 8);//'8'
        Insertdata(L, 9, 9);//'9'
        printf("\n");
        printf("(3)输出单链表:\n");
        output(L);
        printf("(4)输入min和max:");
        scanf_s("%d,%d", &a, &b);
        printf("\n");
        deletes(L, a, b);
        printf("(5)处理后的单链表:");
        output(L);
        printf("\n");
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月11日
  • 已采纳回答 6月3日
  • 修改了问题 6月1日
  • 创建了问题 6月1日

悬赏问题

  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题