概述
题目:已知单链表L(带头节点)是一个递增有序表,试编写一算法,删除表中值大于min且小于max的节点(若表中有这样的节点),同时释放被删节点的空间,这里min和max是两个给定参数。
【输入形式】
首先输入正整数T,表示有T组测试数据。输入整数len定义链表长度,然后递增地给出链表的值。接着输入正整数q,表示进行q次操作,每次操作输入一个整数type表示操作类型:输入1,表示输出链表; 输入2, 表示删除链表;在选择删除时同时输入min 和 max的值表示删除范围。例如:输入2 2 4,表示删除大于2小于4的值。最后再次输入1,输出删除元素后的单链表。
【输出形式】 输出建立的单链表和删除元素后的单链表。
【样例输入】
1
5
1 2 3 4 5
3
1
2 2 4
1
【样例输出】
1 2 3 4 5
1 2 4 5
思路:
遍历整个链表的节点的同时判断元素的值是否符合删除条件(x<max&&x>min),若符合,删除节点并释放。若不符合,指针指向下个节点继续判断直到结束。当全部节点完成后,带回新的L。
代码实现:
//删除单链表中值大于min且小于max的节点
#include<stdio.h>
#include <stdlib.h>
typedef struct Node
{
int data;
struct Node * next;
}Node;
typedef Node * LinkList;
//初始化链表
LinkList CreateList()
{
int T;
scanf("%d",&T);
LinkList L;
LinkList p;
LinkList r;
int x;
int i;
int len;
r=L=(LinkList)malloc(sizeof(Node));
L->next=NULL;
scanf("%d",&len);
for(i=0;i<len;i++)
{
scanf("%d",&x);
p=(LinkList)malloc(sizeof(Node));
p->data=x;
p->next=NULL;
r->next=p;
r=p;
}
return L;
}
//输出链表的元素
void Printlist(LinkList L)
{
LinkList p;
p = L;
while(p->next!=NULL)
{
p = p->next;
printf("%d ",p->data);
}
}
//删除大于min小于max的元素
LinkList DeleteList(LinkList L,int min,int max,int len)
{
LinkList p,s;
s=L;
p=L->next;
while(p!=NULL)
{
if(p->data>min&&p->data<max)
{
LinkList del;
del=p;
s->next=p->next;
free(del);
p=s->next;
}
else
{
s=s->next;
p=p->next;
}
}
return L;
}
int main()
{
LinkList L;
L=CreateList();
int len;
int q;
scanf("%d",&q);
int do1;
scanf("%d",&do1);
int do2;
scanf("%d",&do2);
int min,max;
scanf("%d",&min);
scanf("%d",&max);
int do3;
scanf("%d",&do3);
if(do1==1)
Printlist(L);
if(do2==2)
{
int j=0;
DeleteList(L,min,max,j,len);
if(do3==1)
printf("n");
Printlist(L);
}
return 0;
}
//CSDN ID: henry_moon
//欢迎大家关注我!
最后
以上就是野性心锁为你收集整理的删除单链表中的元素:删除表中值大于min且小于max的节点的全部内容,希望文章能够帮你解决删除单链表中的元素:删除表中值大于min且小于max的节点所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复