单链表的合并

#include "stdio.h"
#include "malloc.h"
#include "stdlib.h"//用于产生随机数
#include "time.h"//时间作为随机种子
#define ERRO 0
#define OK  1
typedef int ElemType;//元素类型名重命名
typedef int Status;//状态类型重命名

/*结点结构体*/
typedef struct Node
{
	ElemType data;//数据域
    struct Node *next;//存放后继节点的指针域

}Node;
typedef  Node *LinkList;//定义一个结构体指针,取一个别名
/***********************************************关于 typedef  Node *LinkList 的理解*************************************
typedef  Node *LinkList定义了一个结构体指针,Status CreatLinkList (LinkList *L,int n)的参数1定义了一个结构体指针的指针,
插入和删除用到的是实参,如果只传个形参过去是不行的,所以就需要用指向指针的指针。虽然在Status CreatLinkList (LinkList L,int n)
中L是一个一级指针,假如 L=PA,那么L得到的是PA的地址,然后在函数中对L的值(值为地址)进行改变,那么实际上改变的只形参L的地址,并没
有改变PA的地址值,为了改变PA的地址值,需要二级指针。
***********************************************************************************************************************/

/*头插法
Status CreatLinkList (LinkList *L,int n)//创建链表,L是指针的指针,n为创建的数据个数
{
	LinkList p;
	int i;
	srand(time(0));//初始化随机种子
	*L = (LinkList)malloc(sizeof(Node));//*L是一个指针的地址,不是访问地址对应的值,因为它是二级指针
	(*L)->next = NULL;//->的运算优先级高于*,所以加括号,建立一个头节点,因为刚开始还没有元素,所以指向空
	for ( i = 0; i < n ; i++)
	{
		p = (LinkList)malloc(sizeof(Node));//生成新节点
		p->data = rand() % 100 + 1;//产生随机数
		p->next = (*L)->next; //头插法
		(*L)->next = p;
	}

	
}*/

/*********************************尾插法********************************************************/
Status CreatLinkList(LinkList *L, int n)//创建链表,L是指针的指针,n为创建的数据个数
{
	LinkList p,r;
	int i;
	srand(time(0));//初始化随机种子
	*L = (LinkList)malloc(sizeof(Node));//*L是一个指针的地址,不是访问地址对应的值,因为它是二级指针
	r = *L;//指向尾部结点
	for (i = 0; i < n; i++)
	{
		p = (Node*)malloc(sizeof(Node));//生成新节点
		p->data = rand() % 100 + 1;//产生随机数
		r->next = p;//尾部结点变为为p
		r = p;//尾部加一为p
	}
	r->next = NULL;
	return OK;
}

/*********************************合并两个链表**********************************************/
Status LinklistMerge(LinkList L, LinkList J)//第一个链表的尾结点和第二个链表的头结点合并,并传递给K
{
	LinkList p;
	p = L->next;
	while (p->next)//获得尾部指针
	{
		p = p->next;   
	}
	p->next = J->next;//让尾部结点指针指向第二个链表头节点
	free(J);//释放头节点
}
/**********************************求表长**************************************************/
Status LinklistLength(LinkList L)
{
	LinkList p;
	int j=0;
	p = L->next;
	while (p!=NULL)
	{
		j++;
		p = p->next;
	}
	printf("%d",j);
}
/*********************************元素输出**************************************************/
void ListOutput(LinkList L)
{
	LinkList p;
	p = L->next;  
	while (p != NULL)
	{
		printf("%d->", p->data);
		p = p->next;
	}
	printf("||");
}

void main()
{
	LinkList List1, List2;
	int length;
	CreatLinkList(&List1, 5);
	CreatLinkList(&List2, 5);
	ListOutput(List1);
	LinklistLength(List1);
	printf("\n");
	ListOutput(List2);
	LinklistLength(List2);
	LinklistMerge(List1,List2);
	printf("\n");
	ListOutput(List1);
	LinklistLength(List1);
	printf("\n");
}

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值