假设两个按元素值递增有序排列的线性表A和B,均以单链表作为存储结构,请编写算法,将A表和B表归并成一个按元素值递减有序排列的线性表C,并要求利用原表(即A表和B表的)结点空间存放表C。

假设两个按元素值递增有序排列的线性表A和B,均以单链表作为存储结构,请编写算法,将A表和B表归并成一个按元素值递减有序排列的线性表C,并要求利用原表(即A表和B表的)结点空间存放表C。

/*
2019/9/25
By ASJA
*/
#include<stdio.h>
#include<iostream>
typedef struct LinkNode {
	int data;
	LinkNode* next;
	void InitForTest(LinkNode*& initLink, int TestData[],int length);
	int cmp(int a, int b);
	void PrintLink(const LinkNode* Pt);
	void MainMethodForBToS(LinkNode*& DataLInk, LinkNode*& Ha_or_b, LinkNode*& Pc);
	void Combine_Big_To_S(LinkNode*& A, LinkNode*& B, LinkNode*& C);
}*Link;
void LinkNode::InitForTest(LinkNode*& initLink, int TestData[], int length){
	initLink = (Link)malloc(sizeof(Link));
	initLink->data = length;   //index_0 as len  
	Link p = initLink;
	for (int i = 0; i < length; i++) {
		Link s;//for inset
		s = (Link)malloc(sizeof(Link));
		if (s == NULL) { printf("malloc error"); exit(-1); }
		s->data = TestData[i];    //data input
		p->next = s;
		p = s;
	}
	p->next = NULL;
}
int LinkNode::cmp(int a, int b) {
	if (a >= b)return 1;
	else return -1;
}
void LinkNode::PrintLink(const LinkNode* Pt) {
	while (Pt->next) {
		std::cout << Pt->next->data << "    ";
		Pt = Pt->next;
	}
	std::cout << std::endl;
}
void LinkNode::MainMethodForBToS(LinkNode*& DataLInk, LinkNode*& Ha_or_b, LinkNode*& Pc) {
	Ha_or_b = DataLInk;
	DataLInk = DataLInk->next;
	Ha_or_b->next = NULL;
	Ha_or_b->next = Pc;
	Pc = Ha_or_b;
}
void  LinkNode::Combine_Big_To_S(LinkNode*& A, LinkNode*& B, LinkNode*& C) {
	Link Pa, Pb, Pc;     //pa pb pc  playas  current position
	Link Ha, Hb;      //Ha   Hb  is  for temp
	Pc = (Link)malloc(sizeof(Link));
	Pc->data = 0; Pc->next = NULL;   //   as for init len is 0

	int a, b;    //a   b   as   dataelement
	Pa = A->next;
	Pb = B->next;      //first node
	while (Pa && Pb){
		a = Pa->data;
		b = Pb->data;
		switch (cmp(a, b)){
		case  1: 	LinkNode::MainMethodForBToS(Pb, Hb, Pc); break;
		case -1:    LinkNode::MainMethodForBToS(Pa, Ha, Pc); break;
		default:    break;
		}
	}
	
	if (!Pa) {
		while (Pb) 	LinkNode::MainMethodForBToS(Pb, Hb, Pc);
	}else {
		while (Pa) 	LinkNode::MainMethodForBToS(Pa, Ha, Pc);
	}
	
	C = Pc;

}

int main() {
	//for test
	Link A, B, C;
	//init A and B for test
	int TestDataA[] = { 2,5,7,10,46 };    //for test
	int TestDataB[] = { 4,5,13,34,78,82,100 };    //for test
	A->InitForTest(A, TestDataA,5);
	B->InitForTest(B, TestDataB,7);

	//print A   and   B
	std::cout << "Link A : ";       //for  show
	A->PrintLink(A);
	std::cout << "Link B : ";
	B->PrintLink(B);

	//main  method   Combine
	A->Combine_Big_To_S(A, B, C);

	//print  the Result C
	std::cout << "After Combined : ";     //for show
	while (C->next){
		std::cout << C->data << "    ";
		C = C->next;
	}
	system("pause");

}
  • 11
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值