题目:设在一个带头结点的单链表中所有元素结点的数据值无序排列,试编写一个函数,删除表中所有大于min,小于max的元素。
思路:
代码实现:
#include <cstdio>
#include <cstdlib>
typedef int DataType;
typedef struct node{
DataType val;
struct node *next;
}LinkList;
void Init_List(LinkList *&L){
L = (LinkList*) malloc(sizeof(LinkList));
L->next = NULL;
}
void Create_List(LinkList *&L){
LinkList *first = L;
int val, n;
printf("请输入要处理的序列的个数:");
scanf("%d", &n);
if (n == 0) return;
printf("请输入%d个数据:", n);
for (int i = 0; i < n; i++){
scanf("%d", &val);
LinkList *q = (LinkList* ) malloc(sizeof(LinkList));
q->val = val;
first->next = q;
first = q;
}
first->next = NULL;
}
void Print(LinkList *&L){
// 创建头指针,进行遍历输出单链表中的元素的个数
LinkList *first = L->next;
while(first != NULL){
printf("%d ", first->val);
first = first->next;
}
}
void Clear(LinkList *&L){
int max, min;
printf("请输入max:");
scanf("%d", &max);
printf("请输入min:");
scanf("%d", &min);
// 查找区间内的值,若找到则删除
LinkList *q, *first = L;
while(first->next != NULL){
if (first->next->val > min && first->next->val < max){
q = first->next;
first->next = first->next->next;
free(q);
continue;
}
first = first->next;
}
printf("最终得到的序列为:");
Print(L);
}
int main(){
LinkList *L;
Init_List(L);
Create_List(L); // 利用前插法存入数据
// 单链表逆转
if (L->next == NULL) printf("序列为空。");
else Clear(L);
}