单链表的基本操作

关于单链表的一些基本操作
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;

#define OVERFLOW -2
#define ERROR -1
#define SUCCESS 0

typedef 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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值