/*实验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; }
posted on 2011-10-22 10:03 1.曲待续 阅读(537) 评论(0) 编辑 收藏 举报