线性表的有关操作

目的要求:

⑴掌握单向链表的存储特点及其实现。

⑵掌握单向链表的插入、删除算法及其应用算法的程序实现。

实验内容:

⑴随机产生或键盘输入一组元素,建立一个带头结点的单向链表(无序)。

⑵遍历单向链表。

⑶把单向链表中元素逆置(不允许申请新的结点空间)。

⑷在单向链表中删除所有的偶数元素结点。

⑸编写在非递减有序链表中插入一个元素使链表元素仍有序的函数,并利用该函数建立一个非递减有序单向链表。

⑹利用算法5建立两个非递减有序单向链表,然后合并成一个非递增链表。

⑺利用算法5建立两个非递减有序单向链表,然后合并成一个非递减链表。


#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<queue>
using namespace std;
typedef long long ll;
struct data
{
    int n;
    data *next;
};
data shuru(int n,data root)///输入
{
    data *p=&root;
    while(n--)
    {
        int t;
        cin>>t;
        data *pp=(data*)malloc(sizeof(data));
        pp->n=t;
        pp->next=NULL;
        p->next=pp;
        p=pp;
    }
    return root;
}

void bianli(data root)///遍历
{
    data *p=root.next;
    while(p!=NULL)
    {
        int hh=p->n;
        cout<<hh<<' ';
        p=p->next;
    }
    cout<<endl;
}

data nizhi(data root)///逆置
{
    data *p=NULL,*pp=root.next,*tem=pp->next;
    while(pp!=NULL)
    {
        pp->next=p;
        p=pp;
        pp=tem;
        if(tem!=NULL)
            tem=tem->next;
    }
    root.next=p;
    return root;
}

data shanoushu(data root)///删除偶数节点
{
    data *p=&root,*pp=p->next;
    while(pp!=NULL)
    {
        if((pp->n)%2==0)
            p->next=pp->next,free(pp);
        else
            p=p->next;
        pp=p->next;
    }
    return root;

}

data charupaixu(data root,int n)///递增插入排序
{
    data *p=&root,*pp=p->next;
    while(pp!=NULL)
    {
        if(pp->n>n)
        {
            data *s=(data *)malloc(sizeof(data));
            s->n=n,s->next=pp;
            p->next=s;
            return root;
        }
        p=pp;
        pp=pp->next;
    }
    data *s=(data *)malloc(sizeof(data));
    s->n=n,s->next=NULL;
    p->next=s;
    return root;
}

data dijianhebing(data root1,data root2)///递减合并
{
    root1=nizhi(root1);
    root2=nizhi(root2);
    data ROOT;
    ROOT.next=NULL;
    data *p=root1.next,*q=root2.next,*pp=&ROOT;
    while(p!=NULL||q!=NULL)
    {
        data *t=(data*)malloc(sizeof(data));
        if(p!=NULL&&q!=NULL)
        {
            if(p->n>q->n)
                t->n=p->n, t->next=NULL,pp->next=t,p=p->next;
            else
                t->n=q->n,t->next=NULL,pp->next=t,q=q->next;
        }
        else if(p!=NULL)
            t->n=p->n, t->next=NULL,pp->next=t,p=p->next;
        else
            t->n=q->n,t->next=NULL,pp->next=t,q=q->next;
        pp=t;
    }
    root1=nizhi(root1);
    root2=nizhi(root2);
    return ROOT;
}

data dizenghebing(data root1,data root2)///递增合并
{
    data ROOT;
    ROOT.next=NULL;
    data *p=root1.next,*q=root2.next,*pp=&ROOT;
    while(p!=NULL||q!=NULL)
    {
        data *t=(data*)malloc(sizeof(data));
        if(p!=NULL&&q!=NULL)
        {
            if(p->n<q->n)
                t->n=p->n, t->next=NULL,pp->next=t,p=p->next;
            else
                t->n=q->n,t->next=NULL,pp->next=t,q=q->next;
        }
        else if(p!=NULL)
            t->n=p->n, t->next=NULL,pp->next=t,p=p->next;
        else
            t->n=q->n,t->next=NULL,pp->next=t,q=q->next;
        pp=t;
    }
    return ROOT;
}

int main()
{
    int n;
    data root;
    cout<<"请输入链表1要输入元素的个数"<<endl;
    cin>>n;
    cout<<"请输入这"<<n<<"个元素"<<endl;
    root=shuru(n,root);

    cout<<endl;

    cout<<"遍历链表1的结果:"<<endl;
    bianli(root);

    cout<<endl;

    cout<<"请输入链表2要输入元素的个数"<<endl;
    cin>>n;
    data root2;
    cout<<"请输入这"<<n<<"个元素"<<endl;
    root2=shuru(n,root2);

    cout<<endl;

    cout<<"遍历链表2的结果:"<<endl;
    bianli(root2);

    cout<<endl;

    cout<<"建立非递减有序单向新链表1:"<<endl;
    data Root;
    Root.next=NULL;
    data *p=root.next;
    while(p!=NULL)
    {
        Root=charupaixu(Root,p->n);
        p=p->next;
    }
    bianli(Root);

    cout<<endl;

    cout<<"建立非递减有序单向新链表2:"<<endl;
    data Root2;
    Root2.next=NULL;
    p=root2.next;
    while(p!=NULL)
    {
        Root2=charupaixu(Root2,p->n);
        p=p->next;
    }
    bianli(Root2);

    cout<<endl;

    cout<<"将链表1和链表2合并成一个非递增链表:"<<endl;
    data ROOT=dijianhebing(Root,Root2);
    bianli(ROOT);

    cout<<endl;

    cout<<"将链表1和链表2合并成一个非递减链表:"<<endl;
    data ROOT0=dizenghebing(Root,Root2);
    bianli(ROOT0);

    cout<<endl;


    cout<<"逆置原链表1的结果:"<<endl;
    root=nizhi(root);
    bianli(root);
    root=nizhi(root);

    cout<<endl;

    cout<<"删除偶数节点后的链表1:"<<endl;
    root=shanoushu(root);
    bianli(root);

    cout<<endl;

    return 0;
}



posted @ 2016-04-08 09:31  martinue  阅读(198)  评论(0编辑  收藏  举报