带头结点的单链表,数据元素是整数(4)

一、采用归并的方法,将两个升序的链表La和Lb,合并成一个升序的链表Lc。

二、把链表pp结点之后的结点原地逆置(反转),返回值:0-失败;1-成功。

三、(1)(2)(3)(4)的主函数

采用归并的方法,将两个升序的链表La和Lb,合并成一个升序的链表Lc。

// 采用归并的方法,将两个升序的链表La和Lb,合并成一个升序的链表Lc。
int MergeList(LinkList La, LinkList Lb, LinkList Lc)
{
	if ((La == NULL) || (Lb == NULL) || (Lc == NULL))
	{
		printf("表La、Lb、Lc至少有一个不存在。\n");
		return 0;
	}
	La = La->next;
	Lb = Lb->next;
	LNode* pp;
	//把La和Lb合并到Lc中
	while ((La != NULL) && (Lb != NULL))
	{
		if (La->data <= Lb->data)
		{
			pp = La;
			La = La->next;
		}
		else
		{
			pp = Lb;
			Lb = Lb->next;
		}
		//把较小者追加到Lc中
		Lc->next = (LNode*)malloc(sizeof(LNode));//分配一个新结点
		Lc = Lc->next;
		memcpy(&Lc->data, &pp->data, sizeof(ElemType));
		Lc->next = NULL;
	}
	//把链表La其他元素追加到Lc中
	while (La != NULL)
	{
		Lc->next = (LNode*)malloc(sizeof(ElemType));//分配一个新结点
		Lc = Lc->next;
		memcpy(&Lc->data, &La->data, sizeof(ElemType));
		Lc->next = NULL;
		La = La->next;
	}
	// 把链表Lb其它的元素追加到Lc中。
	while (Lb != NULL)
	{
		Lc->next = (LNode*)malloc(sizeof(LNode));  // 分配一个新结点。
		Lc = Lc->next;
		memcpy(&Lc->data, &Lb->data, sizeof(ElemType));
		Lc->next = NULL;
		Lb = Lb->next;
	}
	return 1;
}

以下代码显示两个链表的合并,把两个有序的La和Lb合并成有序的Lc。

LinkList La,Lb,Lc;

	La=InitList1();
	Lb=InitList1();
	Lc=InitList1();

	ee=1;  PushBack(Lb, &ee);
	ee=2;  PushBack(La, &ee);
	ee=3;  PushBack(Lb, &ee);
	ee=4;  PushBack(Lb, &ee);
	ee=5;  PushBack(La, &ee);
	ee=6;  PushBack(Lb, &ee);
	ee=7;  PushBack(Lb, &ee);
	ee=8;  PushBack(Lb, &ee);
	ee=9;  PushBack(La, &ee);
	ee=10; PushBack(La, &ee);

	PrintList(La);
	PrintList(Lb);

	MergeList(La,Lb,Lc);

	PrintList(Lc);

	DestroyList1(La); La=NULL;
	DestroyList1(Lb); Lb=NULL;
	DestroyList1(Lc); Lc=NULL;

把链表pp结点之后的结点原地逆置(反转),返回值:0-失败;1-成功。 

// 把链表pp结点之后的结点原地逆置(反转),返回值:0-失败;1-成功。
void ReverseList(LNode* pp)
{
	LNode* ss;      // 当前结点。
	LNode* ssnext;  // 当前结点的下一结点。
	ss = pp->next;    // 从pp结点之后的结点开始反转。
	pp->next = NULL;  // pp->next指向空。
	while (ss != NULL)
	{
		ssnext = ss->next;  // 保留ss下一结点的地址。
		// 以下两行相当于在pp之后插入ss结点。
		ss->next = pp->next;
		pp->next = ss;
		ss = ssnext;  // ss结点后移。
	}
}

(1)(2)(3)(4)的主函数 

int main()
{
	LinkList LL = NULL; // 声明链表指针变量。
	LL = InitList1();     // 初始化链表。
	printf("LL=%p\n", LL);
	ElemType ee;      // 创建一个数据元素。
	printf("在表中插入元素(1、2、3、4、5、6、7、8、9、10)。\n");
	ee = 1;  InserList(LL, 1, &ee);
	ee = 2;  InserList(LL, 1, &ee);
	ee = 3;  InserList(LL, 1, &ee);
	ee = 4;  InserList(LL, 1, &ee);
	ee = 5;  InserList(LL, 1, &ee);
	ee = 6;  InserList(LL, 1, &ee);
	ee = 7;  InserList(LL, 1, &ee);
	ee = 8;  InserList(LL, 1, &ee);
	ee = 9;  InserList(LL, 1, &ee);
	ee = 10; InserList(LL, 1, &ee);
	printf("length=%d\n", LengthList(LL));
	PrintList(LL);
	printf("在第5个位置插入元素(13)。\n");
	ee = 13; InserList(LL, 5, &ee);
	PrintList(LL);
	printf("在表头插入元素(11),表尾插入元素(12)。\n");
	ee = 11; PushFront(LL, &ee);
	ee = 12; PushBack(LL, &ee);
	PrintList(LL);
	printf("删除表中第7个结点。\n");
	DeleteNode(LL, 7); PrintList(LL);
	printf("删除表中第一个结点。\n");
	PopFront(LL); PrintList(LL);
	printf("删除表中最后一个结点。\n");
	PopBack(LL); PrintList(LL);
	LNode* tmp;
	if ((tmp = LocateNode(LL, 3)) != NULL)
		printf("第3个结点的地址是=%p,ee=%d\n", tmp, tmp->data);
	ee = 8;
	if ((tmp = LocateElem(LL, &ee)) != NULL)
		printf("元素值为8的结点的地址是=%p\n", tmp);
	else
		printf("元素值为8的结点的地址是NULL,没找着。\n");
	printf("在结点%p之后插入66\n", tmp);
	ee = 66;
	InsertNextNode(tmp, &ee);  PrintList(LL);
	printf("在结点%p之前插入55\n", tmp);
	ee = 55;
	InsertPriorNode(tmp, &ee);  PrintList(LL);
	// ReverseList(LL); PrintList(LL);  // 反转链表。
	DestroyList1(LL); LL = NULL;  // 销毁链表,LL置为空。
	printf("LL=%p\n", LL);
system("pause");
	return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值