c++编程 将两个有序线性表合并为一个按从小到大顺序的线性表,并遍历输出其结果

2024-12-16 13:39:13
推荐回答(1个)
回答1:

以前写的,懒得分拆了。直接贴过来。里面有有序表的各种操作。链表的思想是差不多的。
判断
while(pa->next!=null&&pb->next!=null)
{
if(pa->data>pb->data) pb->data插入到新建c链表的的表尾。pb=pb->next;
if(pa->datadata) pa->data 插入c表为。 pa=pa->next;
}
最后没查完的链表剩余部分整体连接到c的表尾。用指针。很简单。
这是有序表的。你想用泛型编程的话,改造一下就行了。
#include
const int MaxLen=100;
typedef struct
{
int data[MaxLen];
int Len;
}seqlist;
void initial_list(seqlist *L)//初始化;
{
L->Len=0;
}
void list_getdata(seqlist *L) //输入线性表
{
std::cout<<"输入线性表长度:";
std::cin>>L->Len;
std::cout<<"输入数据:" ;
for(int i=0;iLen;i++)
std::cin>>L->data[i];
}
int list_Len(seqlist L)//获得线性表的长度;
{
std::cout<<"线性表长度为:" ;
return(L.Len);
}
void get_element(seqlist L,int i) //找到第i个数据 ;
{
int x;
if(i<1||i>L.Len)
std::cout<<"超出范围,错误"< else x=L.data[i-1];
std::cout<<"第"< std::cout<}
void get_locate(seqlist L,int x)//找到值等于x的数据位于线性表的第几个元素;
{
for(int i=0;i {
if(L.data[i]==x)
std::cout< else
std::cout<<"error:无此数据";
}
}
void list_insert(seqlist *L,int i,int x)//将x插入线性表的第i个位置;
{
int j;
if(L->Len==MaxLen)
std::cout<<"溢出"< else if(i<1||i>L->Len+1)
std::cout<<"插入位置错误"< else
{
for(j=L->Len;j>i-1;j--)
L->data[j]=L->data[j-1];
L->data[i-1]=x;
L->Len++;
}
}
void list_delete(seqlist *L,int i)//删除第i个元素;
{
if(L->Len<=0)
std::cout<<"溢出出错"< else if(i>L->Len||i<1)
std::cout<<"删除位置出错"< else
for(int j=i-1;jLen-1;j++)
L->data[j]=L->data[j+1];
L->Len--;
}
void list_print(seqlist L)//输出线性表;
{
std::cout<<"线性表为:"< for(int i=0;i std::cout<}
bool list_b_include_a(seqlist *A,seqlist *B)//判断包含关系;
{
int i,j;
bool suc;
for(i=0;iLen;i++)
{
j=0;suc=0;
while(jLen&&suc==0)
if(A->data[i]==B->data[j])
suc=1;
else j++;
if(suc==0) return false;
}
if(suc==1) return true;
}
bool list_b_include_a_YouXu(seqlist *A,seqlist*B)//判断有序数列包含关系
{
int ia=0,ib=0;
while(iaLen&&ibLen)
if(A->data[ia]==B->data[ib])
{
ia++;
ib++;
}
else if(A->data[ia]>B->data[ib]) ib++;
else return false;
if(ia==A->Len) return true;
else return false;
}
void list_combin(seqlist *A,seqlist *B)//合并两个表
{
int m=A->Len;
for(int i=0;iLen;i++)
{
list_insert(A,m+i+1,B->data[i]);
}
list_print(*A);
}
void list_combin_YouXu(seqlist *A,seqlist *B,seqlist *C)//合并有序数列
{
int ia=0,ib=0,ic=0;
while(iaLen&&ibLen)
if(A->data[ia]==B->data[ib])
{
C->data[ic++]=A->data[ia++];
C->data[ic++]=B->data[ib++];
}
else if(A->data[ia]data[ib])
C->data[ic++]=A->data[ia++];
else C->data[ic++]=B->data[ib++];
while(iaLen) C->data[ic++]=A->data[ia++];
while(ibLen) C->data[ic++]=B->data[ib++];
C->Len=ic;
}
int main()
{
/*seqlist L1;
initial_list(&L1);
std::cout< list_getdata(&L1);
//std::cout< std::cout< std::cout< get_element(L1,3);
list_print(L1);
list_insert(&L1,4,127);
std::cout< list_print(L1);
list_delete(&L1,2);
std::cout<<'\n';
list_print(L1);
*/
/* int i=1; ;
while(i==1)
{
std::cout<<"**********判断La是否是Lb的子集***********"< seqlist La,Lb;
list_getdata(&La);//La={1,3,8}
list_print(La);
list_getdata(&Lb);//Lb={2,1,8,6,9,3}
list_print(Lb);
std::cout< std::cout<<"是否继续?"<<"1:是 2:否"< std::cin>>i;
} */
std::cout<<"合并俩个线性表"< seqlist L1,L2,L3;
list_getdata(&L1);
list_getdata(&L2);
//list_combin(&L1,&L2);
list_combin_YouXu(&L1,&L2,&L3);
list_print(L3);
return 0;
}