写一个函数DeleteRange删除单链表中结点的值在low 和high之间的结点

/*实验2
1.  写一个函数DeleteRange删除单链表中结点的值在low 和high之间的结点
(low和high的值是多少可自由设计)。并且要在程序中验证其功能实现。
(可在实验1的第3题的基础上增加此功能)。
此题的源程序保存为 2_a4.cpp。
*/
#include<iostream>
using namespace std;
typedef char datatype;
typedef struct node* pointer;
struct node
{
	datatype data;
	pointer next;
};
typedef node* lklist;

lklist Creat() 
{//尾插法建表,有头结点
	pointer head,rear,s; char ch;
	head=new node;	//生成头结点
	rear=head;		//尾指针初值
	cout<<"请依次输入链表中的元素,每个元素是一个字符,以输入$表示结束:"<<endl;
	while(cin>>ch,ch!=')
	{  //读入并检测结束
		s=new node;	 s->data=ch; //生成新结点
		rear->next=s; rear=s;	   //插入表尾,改尾指针
	}
	rear->next=NULL;	//尾结点的后继为空
	return head;
}

lklist InitList() 
{
	pointer head;
	head=new node;
	head->next=NULL;
	return head;
} 
int Length(lklist L)
 {
	int j; 
	pointer p;
	j=0; 
	p=L->next;		//从首结点开始
	while(p!=NULL) //逐点检测、计数
	{	
		j++; 
		p=p->next;
	}		
	return j;
}
pointer Get(lklist head,int i) //0≤i≤n
{
	int j;
	pointer p;
	if(i<0) return NULL;//位置非法,无此结点
	j=-1;			//计数器
	p=head;			//从头结点(0号)开始搜索
	while(p!=NULL) {
		j++;if(j==i) break;
		p=p->next;		//未到第i点,继续
	}
	return p;		//含找到、未找到两种情况
}

int Insert(lklist head,datatype x,int i)
{
	pointer q,s;
	q=Get(head,i-1);	//找第i-1个点
	if(q==NULL)   //无第i-1点,即i<1或i>n+1时
    {
		cout<<"非法插入位置!\n";
		return 0;
	}
	s=new node;		//生成新结点
	s->data=x;
	s->next=q->next;  //新点的后继是原第i个点
	q->next=s;		//原第i?1个点的后继是新点
	return 1;		//插入成功
}


int Delete(lklist head,int i) 
{
	pointer p,q;
	q=Get(head,i-1);	//找待删点的直接前趋
	if(q==NULL || q->next==NULL)//即i<1或i>n时		             
    {cout<<"非法删除位置!\n";return 0;}
	p=q->next;			//保存待删点地址
	q->next=p->next;	//修改前趋的后继指针
	delete p;			//释放结点
	return 1;			//删除成功
}



pointer Locate(lklist head,datatype x) 
{
	pointer p;
	p=head->next;	//从首结点开始搜索
	while(p!=NULL) 
	{
		if(p->data==x) break;
		p=p->next;	//到下一个点
	}
	return p; 		//含找到、未找到两种情况
}

int locate2(lklist head,datatype x) {
	int j;
	pointer p;
	j=0;				//计数器
	p=head->next;			//从首结点开始扫描
	while(p!=NULL) {
		j++;
		if(p->data==x) break;//找到,退出
		p=p->next;		  	//没找到,继续
	}
	if(p!=NULL) return j;	//找到x
	else return -1;		//没有x,查找失败
}


void DeleteRange(lklist head,datatype low,datatype high) 
{
	pointer p,q;
	q=head;
	p=head->next;			//从头结点(0号)开始搜索
	while(p!=NULL) 
	{
		if(p->data>=low && p->data<=high) 
		{
			q->next =  p->next;
			delete p;
			p=q->next;
		}
		else
		{
			p=p->next;		
			q=q->next;
		}
	}
}

void Display(lklist head)
{
	pointer p;
	p=head->next;
	cout<<"链表中的元素依次是:";
	while(p!=NULL)
	{
		cout<<p->data<<'\t';
		p=p->next;
	}
	cout<<endl;
}
int main()
{
	lklist Lk;
	Lk=Creat();
	Display(Lk);
	DeleteRange(Lk, 'A','B');
	Display(Lk);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小巫技术博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值