算法思想,找到第一个大于min的结点,然后从这个结点开始访问链表中的元素,如果当前访问的元素值小于max,则将其删除,反之,则链中不存在小于max的元素,停止搜索;重复上述步骤,直到链表中元素都被访问完。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef int Elemtype;
typedef struct LinkNode {
Elemtype data;
LinkNode* next;
}LinkNode, * LinkList;
//尾插法建立单链表(不改变链表输入顺序)
void creatLinkList(LinkList& L) {
L = (LinkNode*)malloc(sizeof(LinkNode));
L->next = NULL;
LinkNode* pTail = L;
Elemtype num;
while (scanf("%d", &num) && num!=-1) {
LinkNode* pnode = (LinkNode*)malloc(sizeof(LinkNode));
pnode->data = num;
pnode->next = pTail->next;
pTail->next = pnode;
pTail = pnode;
}
}
void printLinkList(LinkList L) {
LinkNode* pnode = L->next;
while (pnode != NULL) {
printf("%d ", pnode->data);
pnode = pnode->next;
}
}
void delectNodes(LinkList& L, int min, int max) {
LinkNode* preCur = L;
LinkNode* pCur = L->next;
while (pCur != NULL) {
if (pCur->data > min) {
break;
}
preCur = pCur;
pCur = pCur->next;
}//此时pCur指向第一个大于min的结点,preCur为第一个大于min结点的前驱
while (pCur != NULL && pCur->data < max) {//进行删除操作
preCur->next = pCur->next;//删除
free(pCur);//释放结点
pCur = preCur->next;//指向下一个待删除结点
}
}
int main() {
LinkList L = NULL;
creatLinkList(L);
int min, max;
scanf("%d %d -1", &min, &max);
delectNodes(L, min, max);
printLinkList(L);
return 0;
}