单链表的基本操作

来源:互联网 发布:手机能注册淘宝账号吗 编辑:程序博客网 时间:2024/06/03 14:36
关于单链表的一些基本操作
#include<iostream>#include<cstdlib>#include<ctime>using namespace std;#define OVERFLOW -2#define ERROR -1#define SUCCESS 0typedef int Elem;typedef struct lnode{    Elem data;    struct lnode *next;}Lnode,*Linklist;void ListCreate(Linklist &l){    Linklist lnew,t;    t=l=new Lnode;    l->next=NULL;    int i=20;    Elem e;    e=rand()%101+1;    while(i--){        lnew=new Lnode;        lnew->data=e;        lnew->next=NULL;        l->next=lnew;        e=rand()%101+1;        l=l->next;    }    l=t;    return;}void deletelist(Linklist &l){    Linklist t;    l=l->next;    while(l){       t=l;       l=l->next;       delete t;    }}void trverseL(Linklist &l){    Linklist t=l;    l=l->next;    while(l!=NULL){      cout<<" "<<l->data;      l=l->next;    }    cout<<endl;    l=t;    return;}void reversalL(Linklist l){    Linklist p,q,t;    t=l;    l=l->next;    p=NULL;    while(l){        q=l->next;        l->next=p;        p=l;        l=q;    }    t->next=p;    l=t;}void deletevenL(Linklist &l){    Linklist p,q,t=l;    p=l->next;    while(p!=NULL){        if(p->data%2==0){            q=p;            l->next=p->next;            p=p->next;            delete q;        }        else{            p=p->next;            l=l->next;        }    }    l=t;    return ;}void insertL(Linklist &l,Elem e){    Linklist p,q,t=l;    p=l->next;    while(p){        if(p->data>=e){            q=new Lnode;            q->data=e;            q->next=p;            l->next=q;            l=t;            return ;        }        p=p->next;        l=l->next;    }    q=new Lnode;    q->data=e;    q->next=NULL;    l->next=q;    l=t;    return;}void mergel(){    Linklist p,q,l,t;    p=new Lnode;    p->next=NULL;    q=new Lnode;    q->next=NULL;    l=new Lnode;    l->next=NULL;    for(int i=0;i<20;i++){          //        insertL(p,rand()%101+1);        insertL(q,rand()%101+1);    }    cout<<"第一个链表建立输出:";    trverseL(p);    cout<<"第二个链表建立输出:";    trverseL(q);    t=q;    q=q->next;    delete t;    while(q){        insertL(l,q->data);        t=q;        q=q->next;        delete t;    }    t=p;    p=p->next;    delete t;    while(p){        insertL(l,p->data);        t=p;        p=p->next;        delete t;    }    cout<<"合并成非递减链表:";    trverseL(l);    reversalL(l);    cout<<"合并成非递增链表:";    trverseL(l);    deletelist(l);    return ;}void seprateL(){    Linklist l,p,q,p1,q1;    p=new Lnode;    p1=p;    p->next=NULL;    q=new Lnode;    q1=q;    q->next=NULL;    cout<<"建立一个新的链表: ";    ListCreate(l);  //create new linklist    trverseL(l);    l=l->next;    while(l){        if(l->data%2==0){            p->next=l;            l=l->next;            p=p->next;            p->next=NULL;        }        else{            q->next=l;            l=l->next;            q=q->next;            q->next=NULL;        }    }    cout<<"拆分成两个链表: "<<endl;    cout<<"拆分的第一链表: ";    trverseL(p1);    cout<<"拆分的第二链表: ";    trverseL(q1);    return ;}void TEST(){    int tsnum;    cout<<"本次实验进行链表的有关操作:"<<endl;    cout<<"输入1测试产生链表并遍历操作"<<endl;    cout<<"输入2测试逆转链表并遍历操作"<<endl;    cout<<"输入3测试删除偶数并遍历操作"<<endl;    cout<<"输入4测试合并链表并遍历操作"<<endl;    cout<<"输入5测试拆分链表并遍历操作"<<endl;    cout<<"输入其他数字跳出测试循环"<<endl;    while(1){        cout<<"请输入:";        cin>>tsnum;        cout<<endl;        switch(tsnum){            case 1:{                Linklist l;                cout<<"建立新的链表,并输出:";                ListCreate(l);                trverseL(l);                deletelist(l);                cout<<endl;            }break;            case 2:{                Linklist l;                cout<<"建立新的链表,并输出:";                ListCreate(l);                trverseL(l);                cout<<"逆转链表并输出:";                reversalL(l);                trverseL(l);                deletelist(l);                cout<<endl;            }break;            case 3:{                Linklist l;                cout<<"建立新的链表,并输出:";                ListCreate(l);                trverseL(l);                cout<<"删除偶数结点并输出:";                deletevenL(l);                trverseL(l);                deletelist(l);                cout<<endl;            };break;            case 4:{                mergel();                cout<<endl;            }break;            case 5:{                    seprateL();                    cout<<endl;            }break;            default :return ;break;        }        cout<<"继续测试";    }    return ;}int main(){    srand(time(0));    TEST();    return 0;}

1 0
原创粉丝点击