计一个算法,删除元素递增排列的顺序表或链表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;
}