C语言数据结构编程问题

给定一个顺序存储的线性表L=(a1,a2,.....,an),请设计一个算法删除所有值大于min而且小于max的元素

这也没啥算法可说,遍历线性表,将小于等于min或大于等于max的元素,复制到线性表从0开始的位置,并统计元素数量,最后将线性表的长度值改为统计出来的元素数量就行了。算法时间复杂度为O(n)

遍历就可以了

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

typedef int ElemType; //元素值域类型为int型

typedef struct LNode
{
    ElemType data;
    struct LNode *next;
} LNode, *LinkList;

void createLinkList(LinkList &L);
void deleteElem(LinkList &L, int min, int max);
void printLinkList(LinkList L);

int main()
{
    LinkList L;
    ElemType min, max;
    createLinkList(L);
    printf("输入要删除的最小值和最大值:");
    scanf("%d%d", &min, &max);
    deleteElem(L, min, max);
    printLinkList(L);
    return 0;
}

void createLinkList(LinkList &L)
{
    L = (LinkList)malloc(sizeof(LNode));
    //r始终指向尾结点,初始指向L,即头结点
    LNode *r = L;
    LNode *s;
    int size;

    printf("创建链表,请输入链表大小:");
    scanf("%d", &size);
    for (int i = 1; i <= size; i++)
    {
        s = (LinkList)malloc(sizeof(LNode));
        int x;
        printf("请输入第%d个元素:", i);
        scanf("%d", &x);
        s->data = x;
        r->next = s;
        r = s;
    }
    r->next = NULL;
}
void deleteElem(LinkList &L, int min, int max)
{
    LNode *p = L->next, *pre = L, *tmpNode;
    //循环条件:p不为空
    //若为NULL说明已遍历完成
    while (p)
    {
        if (p->data<min | p->data> max)
        {
            pre = pre->next;
            p = p->next;
        }
        else
        {
            printf("删除%d \n", p->data);
            tmpNode = p; //tmpNode指向该结点
            p = p->next;
            pre->next = p; //删除*tmpNode结点
            free(tmpNode); //释放*tmpNode结点
        }
        }
}

void printLinkList(LinkList L)
{
    //输出链表元素值,每个值后输出一个空格
    LinkList p = L->next;
    while (p)
    {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}

可以啦!可以。