线性表的有关操作

来源:互联网 发布:淘宝如何添加背景音乐 编辑:程序博客网 时间:2024/04/30 05:05

目的要求:

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

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

实验内容:

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

⑵遍历单向链表。

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

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

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

⑹利用算法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;}



0 0
原创粉丝点击