单链表删除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通过参数给定

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

#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");
}

删除函数中你的p没有更新