定义两个按升序排列的有序线性表,将它们合并成一个,要求合并后的线性表仍然按照升序排列。求解

作者&投稿:营慧 (若有异议请与网页底部的电邮联系)
如何将一个无序的线表转换成一个按升序排列的有序线性表(用链表实现)~

#include
#include
#include
typedef int ElemType;
typedef struct LNode {
ElemType date;
struct LNode *next;
}linklist,*link;

/*构造链表*//////////////////////////////////////
void IinitList(link &L)
{
if(L)delete L;
L= (link)malloc(sizeof(LNode)) ;
if (!L) exit(1);
L->next=NULL;
cout<<"链表已经建立
";
}
//////////////////////////////////////////////////////
// /*删除结点*/// //////////////////////////////////////////////
int listdelete(link &L,int i,ElemType &e)
{
link p,q; int j;
p=L;j=0;
while(p->next&&j<i-1)
{
p=p->next;++j;
}

q=p->next;
p->next=q->next;
e=q->date;free(q);
cout<<"结点已经删除
";
return 1;
}
////////////////////////////////////////////// /////////
// /*插入结点*/////////////// ///////////////////////
int listinsert(link &L,int i,ElemType e)
{
link p,q;
int j;
p=L;j=0;
while(p&&j<i-1)
{
p=p->next;++j;
}
q= (link)malloc(sizeof(LNode));
q->date=e;
q->next=p->next;
p->next=q; cout<<"结点已经插入
";
return 1;
}
/////////////////////////////////////////////////////
////*显示数据*///////// ////////////////////////////////
void show(link l)
{ link p; int j;
p=l;j=0;
cout<<"链表的值为:
";
while(p->next)
{
coutnext->date<<endl;
p=p->next;
}
}
//////////////////////// /////////////////////////////////
//////销毁链表////// ////////////////////////////////////////
void destorylinst(link &L)
{
while(L)
{ link p=L;
L=L->next;

free(p) ;
}
L=NULL;
}

////// 打印表头///////////////////////////////////////
void print()
{
cout<<"------------------------
";
cout<<"------------------------
";
}

////查找结点//// ////////////////////////////////////////

void lookfor(link l,int e)
{
if(l==NULL)
cout<<"链表未建立,请先构造链表
" ;
else{
link p; int i=0,j=0;
p=l->next;
cout<<"你查找值的位置是:
" ;
while(p)
{ if(p->date==e)
{ j++;
cout<<i+1<<endl;
}
p=p->next; i++;
}cout<<"查找完毕
";
if(j==0)
cout<<"你查找的值不在链表中 、
";
} }

void putline(link &l)
{
if(l==NULL ||l->next==NULL )
cout<<"链表未建立或是空的,请先构造链表
" ;
else{
link p,q;
p=l->next;
while(p!=NULL)
{ q=p->next;
while(q!=NULL)
{
if(p->date>q->date)
{ ElemType t;
t=p->date;
p->date=q->date;
q->date=t; }
q=q->next;
} p=p->next;
} cout<<"链表已经排序
";
}
}

//////测试函数///// /////////////////////

void main()
{ link L=NULL; int k;
while(1)
{
cout<<"按0退出
"<<"按1建立链表
"<<"按2插入结点
"<<"按3删除结点
"
<<"按4清空链表
"<<"按5查找结点
"<<"按6进行排序
" ;
print();
int a,i,j;
cin>>a;
switch(a)
{ case 0: if(L!=NULL)
destorylinst(L) ;
exit(1);

case 1:
IinitList(L);
k=0;
print();show(L) ;
cout<<"空的链表
";
cout<<"链表长度为: "<<k<<endl;
print();
cout<<"请先给链表输入值,输入 0 再按回车结束
";
int bb;
cin>>bb;
while(bb!=0)
{ k++;
listinsert(L,k,bb) ;
cin>>bb;
} print();
show(L) ; cout<<"链表长度为: "<<k<<endl;
print();break;

case 2:
if(L!=NULL)
{
cout<<"输入位置:
";
cin>>i;
while(i>k+1 || i<1)
{
cout<<"位置错误,重新输入插入位置
" ;
cin>>i;
}
cout<<"输入植;
";
cin>>j;
listinsert(L,i,j) ;
k++;
print();
show(L);
cout<<"链表长度为:"<<k<<endl;
print();
}else
{ cout<<"链表不存在,请先建链表
";
print(); }break;

case 3:
if(L!=NULL)
{
cout<<"输入位置:
";
cin>>i;
while(i>k || i<1)
{
cout<<"位置错误,重新输入删除位置
" ;
cin>>i;
}
listdelete (L,i,j);
cout<<"你删除的是:
";
cout<<j<<endl ;
k--; print();
show(L);
cout<<"链表长度为:"<<k<<endl;
print();
}
else {
cout<<"链表不存在,请先建链表
";
print();
} break;

case 4:
destorylinst(L) ;
cout<<"链表已经清空
";
print();break;

case 5:
print();
cout<<"输入要查找的值;
";
int z;
cin>>z;lookfor(L,z);
print();break;

case 6:
putline(L);
if(L!=NULL)show(L);
print();break;
default:
break ;
}}
delete L;
}

升序:按从小到大的顺序排列(如1、3、5、6、7、9)。降序:就是按从大到小的顺序排列(如9、8、6、4、3、1)。

拓展资料:
排序是计算机内经常进行的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记录序列。分内部排序和外部排序,若整个排序过程不需要访问外存便能完成,则称此类排序问题为内部排序。
反之,若参加排序的记录数量很大,整个序列的排序过程不可能在内存中完成,则称此类排序问题为外部排序。内部排序的过程是一个逐步扩大记录的有序序列长度的过程。
常见排序算法
快速排序、希尔排序、堆排序、直接选择排序不是稳定的排序算法,而基数排序、冒泡排序、直接插入排序、折半插入排序、归并排序是稳定的排序算法。

我只说思想,把两组数列从头开始依次比较,若a数列的数小,将其放在新建数列中,并将a数列向后读取一个,b数列不变还是刚才的数,再次比较,重复知道其中一个数列全部比完并加入到新数列为止,然后将另一数列剩余的数据复制到新数列何中,完毕。。加油啊

定义两个按升序排列的有序线性表,将它们合并成一个,要求合并后的线性表...
答:我只说思想,把两组数列从头开始依次比较,若a数列的数小,将其放在新建数列中,并将a数列向后读取一个,b数列不变还是刚才的数,再次比较,重复知道其中一个数列全部比完并加入到新数列为止,然后将另一数列剩余的数据复制到新数列何中,完毕。。加油啊 ...

找出两个等长升序序列的中位数
答:例如,若序列S1 = (11,13,15,17,19),则S1的中位数为15。两个序列的中位数是含它们所有元素的升序序列的中位数。例如,若序列S2 = (02,04,06,08,20),则S1和S2的中位数为11。假设以两个元素依值递增有序排列的线性表A和B分别表示两个升序序列(即同一表中的元素值各不相同),现...

将两个有序线性表合并成一个有序线性表,用C语言 在线急等!!!
答:printf("输入第二个数组元素个数:");scanf("%d",&n2);printf("输入%d个升序元素(空格隔开):",n2);for(i=0;i<n2;i++)scanf("%d",&b[i]);n3=merge(a,n1,b,n2,s); //a和b数组的元素合并到s数组里去(并消除重复元素),并返回合并后数组的元素个数 printf("合并后元素数组为...

数据结构算法 两线性表A,B求交集。。。请高手指点!!!
答:例如:将A与B按升序排列,设A表头为P,B表头为Q,若A[P]>B[Q]那么Q++,若A[P]<B[Q]那么P++;如果A[P]=B[Q],Q++、P++,Count++,And[Count]=B[Q-1];当P或者Q其中一个达到了A或者B的表尾 算法结束。以下是参考程序://--- include <stdio.h> int A[100001],B[100001];...

如何计算有序线性表中查找的平均长度?
答:平均查找长度=1/12*(1*1+2*2+3*4+4*5)=37/12。关于有序线性表是说线性表中的元素是按照升序或降序(允许相邻元素相同)的方式排列的。线性表是一种基本的计算机内的存储工具。顺序查找的基本思想是:从表中的第一个元素开始,将给定的值与表中逐个元素的关键字进行比较,直到两者相符,查到所...

...16,8,5,14,10,38,23)转换成一个按升序排列的有序线性表(用链表...
答:} list *Sequce(list *head)//链表操作的冒泡排序 { list *p1,*p2;int temp;p1=head->next;while(p1!=NULL){ p2=p1->next;while(p2!=NULL){ if(p1->data > p2->data){ temp=p1->data;p1->data=p2->data;p2->data=temp;} p2=p2->next;} p1=p1->next;} return head;} ...

如何将一个无序的线表转换成一个按升序排列的有序线性表(用链表...
答:typedef struct LNode { ElemType date;struct LNode *next;}linklist,*link;/*构造链表*/// void IinitList(link &L){ if(L)delete L;L= (link)malloc(sizeof(LNode)) ;if (!L) exit(1);L->next=NULL;cout<<"链表已经建立\n";} /// // /*删除结点*/// /// ...

C++的选择排序法是怎么回事?
答:就是用第一个数和后面的比较,将最大(小)的放在第一位(互换),然后用第二个数和后面的比...比到最后就是一个有序数列了.

java集合问题
答:集也有多种变体,可以实现排序等功能,如TreeSet,它把对象添加到集中的操作将变为按照某种比较规则将其插入到有序的对象序列中。它实现的是SortedSet接口,也就是加入了对象比较的方法。通过对集中的对象迭代,我们可以得到一个升序的对象集合。(2)列表 列表的主要特征是其对象以线性方式存储,没有特定顺序,只有一个...

数据结构
答:cout<<"您查找的数据不在线性表中."<<endl;return l;} link * del(link *l, int i){ link *p,*s;p=get(l,i-1);if(p==NULL)cout<<"输入有误"<<endl;else { s=p->next;p->next=s->next;free(s);} return l;} link * add(link *l ){ link *p,*s;cout<<"请输入...