数据结构 合并两个有序表

这篇博客主要介绍了如何将两个已排序的链表和顺序表合并为一个新的有序表。通过C语言实现,分别展示了链表和顺序表两种数据结构的合并过程,确保合并后的表依然有序。在链表合并中,使用头指针和迭代方式比较节点值并构造新链表;在顺序表合并中,遍历两个表,根据值大小将元素依次存入新表。
摘要由CSDN通过智能技术生成
//有两个 有序表 LA和 LB,将它们合并成一个有序表 LC,要求 LC 也是有序 
//链表 
#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node 
{
    ElementType Data;
    PtrToNode   Next;
};
typedef PtrToNode List;

List Create(int a[],int n) 
{
	List L,p;
	L=(List)malloc(sizeof(List)); //链表这里是List
	L->Next = NULL; //带有头结点便于操作
	p=L;
	for(int i=0;i<n;i++)
	{
		List t;
		t=(List)malloc(sizeof(List)); //不断地开空间放数据
		t->Data =a[i];
		
		t->Next = p->Next ;
		p->Next = t;
		p = t;
	}
	return L;
}
void Print( List L )
{
	List p=L->Next ;
	while(p)
	{
		printf("%d ",p->Data );
		p=p->Next ;
	}
}

List Union( List LA, List LB )
{
	List LC,h,p,q;
	LC=(List)malloc(sizeof(List)); //给 LC分配空间 
    h=LC; //头指针 
	p=LA->Next ;  q=LB->Next ; //从头开始扫描 
	
	while( p&&q ) //不断地改变指针指向来创建LC
	{
		if(p->Data <= q->Data ) //LA的值比较小 
		{
			LC->Next = p ;
			LC=p;
			p=p->Next ;
		}
		else
		{
			LC->Next =q;
			LC=q;
			q=q->Next ;
		}
	}
	if(p)
	{
		LC->Next = p;
	}
	else
	{
		LC->Next  = q;
	}
	
	return h;
}

int Length(List L) 
{
	List p;
	int cnt=0;
	p = L->Next ;
	while(p)
	{
		p = p->Next ;
		cnt++;
	}
	return cnt;
}

int main()
{
	int a[5]={1,23,45,67,98};
	int b[4]={2,12,56,89};
    List LA, LB, LC;
    LA = Create(a,5);
    LB = Create(b,4);
    LC = Union(LA, LB);
    //printf("%d  %d  %d\n",Length(LA),Length(LB),Length(LC));
	Print(LC);
    return 0;
}

//有两个 有序表 LA和 LB,将它们合并成一个有序表 LC,要求 LC 也是有序 
//顺序表 
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100 
typedef int Position;
typedef int ElementType;
typedef struct LNode *PtrToNode;
struct LNode 
{
    ElementType Data[MAXSIZE];
    Position Last;
};
typedef PtrToNode List;

List Create(int a[],int n) 
{
	List L;
	L=(List)malloc(sizeof(struct LNode));//顺序表后面sizeof(struct LNode)
	for(int i=0;i<n;i++)
	{
		L->Data [i] = a[i];
	}
	L->Last = n;
	return L;
}
void Print( List L )
{
	for(int i=0;i<L->Last ;i++)
	  printf("%d ",L->Data [i]);
	printf("\n");
}

List Union( List LA, List LB )
{
	List LC;
	LC=(List)malloc(sizeof(struct LNode));
	int i=0,j=0,k=0;
	while(i<LA->Last && j<LB->Last )//两个都没结束 用的是小于Last
	{
		if(LA->Data [i] <= LB->Data [j])//LA的数比较小 
		{
			LC->Data [k] = LA->Data [i];
			i++;k++;
		}
		else
		{
			LC->Data [k] = LB->Data [j];
			j++;k++;
		}
	}
	while(i<LA->Last ) 
	//如果LB扫描完了 但LA还没扫描完那就是i<LA->Last
	{
		LC->Data [k] = LA->Data [i]; //把LA剩下的部分接上去
			i++;k++;
	}
	while(j<=LB->Last )
	{
		LC->Data [k] = LB->Data [j];
			j++;k++;
	}
	LC->Last = LA->Last + LB->Last ;
	//LC的收尾,之前我没写,然后调用打印函数的时候出错,所以最后什么也没显示
	return LC;
}

int main()
{
	int a[5]={1,23,45,67,98};
	int b[4]={2,12,56,89};
    List LA, LB, LC;
    //LC = (List)malloc(sizeof(struct LNode));
    LA = Create(a,5);
	LB = Create(b,4);
    LC = Union(LA, LB);
	//Print(LA); Print(LB);
	Print(LC);
    return 0;
}

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值