1.2链式结构 实现 C = A U B

// 链式结构 实现 C = AUB
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

typedef struct Node
{
	int data;
	struct Node *next;
}*LinkList;

bool InitList(LinkList *L); //创建空链表
bool ListInsert(LinkList L,int pos,int e); //在链表的第pos个位置插入e
bool ListTraverse(LinkList L); //遍历输出链表中各元素

bool GetElem(LinkList L,int pos,int *e);//把第pos个位置的元素赋给e
int ListLength(LinkList L); //求链表的长度
void MergeList(LinkList La,LinkList Lb,LinkList *Lc);

int main()
{
	LinkList La, Lb, Lc;
	int i, a[4] = {3,5,8,11}, b[7] = {2,6,8,9,11,15,20}; 
	InitList(&La);
	for(i = 1; i <= 4; i++)
		ListInsert(La,i,a[i-1]);
	printf("La = ");
	ListTraverse(La);

	InitList(&Lb);
	for(i = 1; i <= 7; i++)
		ListInsert(Lb,i,b[i-1]);
	printf("Lb = ");
	ListTraverse(Lb);

	MergeList(La,Lb,&Lc);
	printf("Lc = ");
	ListTraverse(Lc);
	return 0;
}

bool InitList(LinkList *L) //创建空链表
{
	(*L) = (LinkList)malloc(sizeof(Node));
	if(*L == NULL)
	{
		printf("内存分配失败 程序终止!|n");
		exit(-1);
	}
	(*L)->next = NULL;
	return true;
}

bool ListInsert(LinkList L,int pos,int e) //在链表的第pos个位置插入e
{
	int j = 0;
	LinkList p, s;
	p = L;
	while(p != NULL && j < pos - 1)  //寻找第pos - 1 个结点
	{
		p = p->next;
		j++;
	}
	if(p == NULL || j > pos - 1)
		return false;
	s = (LinkList)malloc(sizeof(Node));
	s->data = e;
	s->next = p->next;
	p->next = s;
	return true;
}

bool ListTraverse(LinkList L)//遍历输出链表中各元素
{
	LinkList p;
	p = L->next;
	while(p != NULL)
	{
		printf("%d ",p->data);
		p = p->next;
	}
	printf("\n");
	return true;
}

void MergeList(LinkList La,LinkList Lb,LinkList *Lc)
{
	//已知线性表La和Lb中的数据元素按值 非递减排列
	//归并La和Lb得到新的线性表Lc,Lc的数据元素也按值非递减排列
	int i = 1, j = 1, k = 0;
	int La_len, Lb_len;
	int ai, bj;
	InitList(Lc); //创建空表Lc
	La_len = ListLength(La);
	Lb_len = ListLength(Lb);
	while(i <= La_len && j <= Lb_len)
	{
		GetElem(La,i,&ai);
		GetElem(Lb,j,&bj);
		if(ai <= bj)
		{
			ListInsert(*Lc,++k,ai);
			i++;
		}
		else
		{
			ListInsert(*Lc,++k,bj);
			j++;
		}
	}
	while(i <= La_len) //表La为非空 Lb为空
	{
		GetElem(La,i++,&ai);
		ListInsert(*Lc,++k,ai);
	}
	while(j <= Lb_len)
	{
		GetElem(Lb,j++,&bj);
		ListInsert(*Lc,++k,bj);
	}
}

int ListLength(LinkList L) //求链表的长度
{
	int i= 0;
	LinkList p = L->next;
	while(p != NULL)
	{
		i++;
		p = p->next;
	}
	return i;
}

bool GetElem(LinkList L,int pos,int *e)//把第pos个位置的元素赋给e
{
	int j = 1; //j为计数器
	LinkList p = L->next; // p指向第一个结点 
	while(p != NULL && j < pos) //顺指针向后查找 直到p指向第i个元素 或 p为空
	{
		p = p->next;
		j++;
	}
	if(p == NULL || j > pos)
		return false;
	*e = p->data;  //取第pos个元素
	return true;
}

程序执行结果:


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值