/*实验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;
}
写一个函数DeleteRange删除单链表中结点的值在low 和high之间的结点
最新推荐文章于 2022-03-02 09:53:40 发布