计一个算法,删除元素递增排列的顺序表或链表L中值大于mink且小于maxk的所有元素。

计一个算法,删除元素递增排列的顺序表或链表L中值大于mink且小于maxk的所有元素。

供参考:

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

typedef int ElemType;
typedef struct LNode
{
    ElemType data;
    struct LNode* next;
}LNode, * pLinkList;

//创建带有头结点的空链表
pLinkList SetNullList_Link()
{
    pLinkList head = (pLinkList)malloc(sizeof(LNode));
    if (head != NULL)
        head->next = NULL;
    else
        printf("申请头节点空间失败!\n");
    return head;
}

//产生一组随机数建立单链表并对单链表排序。
void CreatSortList(pLinkList L, int length)
{
    LNode* p, * pre, * s;
    for (int i = 1; i <= length; i++)
    {
        p = (LNode*)malloc(sizeof(LNode));
        p->data = rand() % 100 + 1;
        p->next = NULL;
        if (!L->next) {//第一个结点,直接链入链表 L
            L->next = p;
        }
        else { //第二个结点开始,排序后链入链表 L
            pre = L;
            while (pre->next != NULL && pre->next->data < p->data) {
                pre = pre->next;
            }
            p->next = pre->next;
            pre->next = p;
        }
    }
}

//将有序单链表L中属于区间(mink, maxk)的元素删除。
void IntervalList(pLinkList L, ElemType mink, ElemType maxk)
{
    if (mink > maxk)
        maxk += mink, mink = maxk - mink, maxk = maxk - mink;
    LNode* pL = L->next, * pt = L, * tail = NULL;
    while (pL && pL->data <= mink){
        pt = pL;
        pL = pL->next;
    }
    while (pL && pL->data < maxk){
        tail = pL;
        pL = pL->next;
    }
    if (tail) {//(mink,maxk)区间在 L 链表数据区间内
        tail = tail->next; pL = NULL;
        while (pt->next != tail){
            pL = pt->next;
            pt->next = pL->next;
            free(pL);
        }
    }
}

void printList(pLinkList list)
{
    pLinkList tmp = list->next;
    int i = 0;
    if (!tmp) {
        printf("NULL");
    }
    else {
        while (tmp)
        {
            printf("%d ", tmp->data);
            tmp = tmp->next;
        }
    }
    printf("\n");
}
 
int main()
{
    srand((unsigned int)time(NULL));
    ElemType mink, maxk;
    pLinkList L = NULL;

    L = SetNullList_Link();
    CreatSortList(L, 10);
    printList(L);

    printf("请输入删除元素数据区间的左值:");
    scanf("%d", &mink);
    printf("请输入删除元素数据区间的右值:");
    scanf("%d", &maxk);

    IntervalList(L, mink, maxk);
    printList(L);
  
    return 0;
}