1、已知带头结点的动态单链表L中的结点是按整数值递增排序的,试写一算法将值为x的结点插入到表L中,使L仍然有序。
2、设计一算法,逆置带头结点的动态链表L。要求利用原表的结点空间, 并要求用尽可能少的时间完成。
3、假设有两个按元素值递增有序的线性表A和B,均以单链表作存储结构,试编写算法将A表和B表归并成一个按元素值递减有序的线性表性表C,并要求利用原表的空间存放C。
#include <cstdio>
#include<iostream>
#include <algorithm>
using namespace std;
typedef struct lnode
{
int data;
struct lnode *next;
}lnode,*linklist;
void initlist(linklist &L)//初始化
{
L=new lnode;
L->next=NULL;
}
void create(linklist &L)//创建链表
{
linklist p,q;
int n;
L=new lnode;
L->next=NULL;
q=L;
cout<<"输入数字并以0结束:";
cin>>n;
while(n)
{
p=new lnode;
p->data=n;
q->next=p;
q=p;
q->next=NULL;
cin>>n;
}
}
void output(linklist &L)//输出链表
{
linklist p;
p=L->next;
while(p)
{
cout<<p->data<<" ";
p=p->next;
}
}
void charu(linklist &L,int a)//插入数字
{
linklist p,q;
p=L;
while(p->next!=NULL&&p->next->data<=a)
p=p->next;
if(p->next==NULL)
{
q=new lnode;
q->data=a;
p->next=q;
q->next=NULL;
}
else
{
q=new lnode;
q->data=a;
q->next=p->next;
p->next=q;
}
}
void combine(linklist &La,linklist &Lb)//合并
{
linklist pa,pb,pc;
pa=La->next;
pb=Lb->next;
pc=La;
while(pa&&pb)
{
if(pa->data<=pb->data)
{
pc->next=pa;
pc=pa;
pa=pa->next;
}
else
{
pc->next=pb;
pc=pb;
pb=pb->next;
}
}
pc->next=pa?pa:pb;
delete Lb;
}
void nizhi(linklist &L)//转置链表
{
linklist p,q;
p=L->next;//->next;
L->next=NULL;
while(p)
{
q=p;
p=p->next;
q->next=L->next;
L->next=q;
}
}
void menu()
{
int n,a;
cout<<"\t\t请输入一个递增的链表"<<endl;
linklist La,Lb;
initlist(La);
initlist(Lb);
create(La);
cout<<"您设置的A链表为:"<<endl;
output(La);
while(1)
{
cout<<"\n\n\t\t _____________________________________"<<endl;
cout<<"\t\t$ $"<<endl;
cout<<"\t\t$ 菜单栏 $"<<endl;
cout<<"\t\t$_____________________________________$"<<endl;
cout<<"\t\t$ $"<<endl;
cout<<"\t\t$________① 【链表插入】___________$"<<endl;
cout<<"\t\t$________② 【链表逆置】___________$"<<endl;
cout<<"\t\t$________③ 【链表合并】___________$"<<endl;
cout<<"\t\t$________④ 【 退出 】___________$"<<endl;
cout<<"\t\t$_____________________________________$"<<endl;
cout<<"\t\t$注释:请根据您的需求输入序号 $"<<endl;
cout<<"\t\t$_____________________________________$"<<endl;
cin>>n;
switch(n)
{
case 1:
cout<<"请输入要插入的数字:";
cin>>a;
charu(La,a);
cout<<"A链表插入后"<<endl;
output(La);
break;
case 2:
nizhi(La);
cout<<"A链表逆置后"<<endl;
output(La);
break;
case 3:
cout<<"\t\t设置另一个递增的链表"<<endl;
create(Lb);
cout<<"设置的B链表为:"<<endl;
output(Lb);
combine(La,Lb);
nizhi(La);
cout<<"A与B合并之后按值递减排列"<<endl;
output(La);
break;
case 4:
exit(0);
}
}
}
int main()
{
menu();
return 0;
}