您的位置:首页 > 其它

线性表的有关操作

2016-04-08 09:31 239 查看
目的要求:
⑴掌握单向链表的存储特点及其实现。
⑵掌握单向链表的插入、删除算法及其应用算法的程序实现。
实验内容:
⑴随机产生或键盘输入一组元素,建立一个带头结点的单向链表(无序)。
⑵遍历单向链表。
⑶把单向链表中元素逆置(不允许申请新的结点空间)。
⑷在单向链表中删除所有的偶数元素结点。
⑸编写在非递减有序链表中插入一个元素使链表元素仍有序的函数,并利用该函数建立一个非递减有序单向链表。
⑹利用算法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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: