实验要求
- 自行建立两个有序的顺序表,然后将其合并成一个新的有序表
- 自行建立两个有序的单链表,然后将其合并成一个新的有序单链表
- 分别分析有序的顺序表合并和有序的单链表合并的算法时间复杂度
顺序表
#include<stdio.h>
#include<stdlib.h>
#define MIXSIZE 100
#define ElemType int
typedef struct
{
ElemType data[MIXSIZE];
int length;
}SqList;
void Initlist(SqList &L)
{
L.length=0;
}
void Createlist(SqList &L,int n)
{
printf("输入元素:");
for(int i=0;i<n;i++)
{
int elem;
scanf("%d",&elem);
L.data[i]=elem;
L.length++;
}
}
void Combination(SqList &L1,SqList &L2,SqList &L3)
{
int i=0,j=0,k=0;
while((i!=L1.length)&&(j!=L2.length))
{
if(L1.data[i]>L2.data[j])
{
L3.data[k++]=L2.data[j++];
}
else
{
L3.data[k++]=L1.data[i++];
}
L3.length++;
}
while(i<L1.length)
{
L3.data[k++]=L1.data[i++];
L3.length++;
}
while(j<L2.length)
{
L3.data[k++]=L2.data[j++];
L3.length++;
}
}
void display(SqList &L)
{
for(int i=0;i<L.length;i++)
{
printf("%d ",L.data[i]);
}
printf("\n");
}
int main()
{
int n;
printf("输入顺序表元素个数:");
scanf("%d",&n);
SqList L1,L2,L3;
Initlist(L1);
Initlist(L2);
Initlist(L3);
printf("创建顺序表1\n");
Createlist(L1,n);
printf("创建顺序表2\n");
Createlist(L2,n);
printf("顺序表1与顺序表2合并\n");
Combination(L1,L2,L3);
printf("打印结果\n");
display(L3);
return 0;
}
运行结果:
单链表
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 10010
#define ElemType int
typedef struct LNode{
ElemType data;
LNode *next;
}LNode,*LinkList;
LinkList initLinkList(int num){
LNode* head=(LNode *)malloc(sizeof(LNode));
LinkList p=head;
p->next=NULL;
int elem;
printf("输入:");
while(num--){
scanf("%d",&elem);
LNode* L=(LNode *)malloc(sizeof(LNode));
L->data=elem;
L->next=NULL;
p->next=L;
p=p->next;
}
return head;
}
void CombinationLinkList(LinkList &l1,LinkList &l2,int &flag){
LinkList now1=l1->next;
LinkList now2=l2->next;
LinkList nx1,nx2;
nx1=now1->next;
nx2=now2->next;
while(now1&&now2){
if((now1->data) < (now2->data)){
while((now1->next)&&(now1->next->data) < (now2->data)){
now1=now1->next;
nx1=nx1->next;
}
now1->next=now2;
now1=nx1;
if(nx1)
nx1=nx1->next;
flag=1;
}else{
while((now2->next)&&(now2->next->data) < (now1->data)){
now2=now2->next;
nx2=nx2->next;
}
now2->next=now1;
now2=nx2;
if(nx2)
nx2=nx2->next;
}
}
}
void display(LinkList p){
LinkList pp=p->next;
while(pp){
int data=pp->data;
printf("%d ",data);
pp=pp->next;
}
}
int main(){
printf("输入元素个数:");
int num;
scanf("%d",&num);
printf("初始化链表1:\n");
LinkList LL1=initLinkList(num);
printf("\n打印链表1:\n");
display(LL1);
printf("\n初始化链表2:\n");
LinkList LL2=initLinkList(num);
printf("\n打印链表2:\n");
display(LL2);
printf("\n两表合并\n");
int flag=0;
CombinationLinkList(LL1,LL2,flag);
if(flag){
display(LL1);
}else{
display(LL2);
}
return 0;
}
运行结果: