链表的有序合并相关_C++实现

链表的有序合并相关_C++实现

构造两个链表

将链表2有序合并到链表1

增加功能使其能删除链表中重复的元素

“head.h”

#include<iostream>
using namespace std;
class NODE
{
public:
	NODE();
	int num;
	NODE *next;
};
NODE::NODE()
{
	num = 0;
	next = NULL;
}
class DATA
{
public:
	DATA();
	void Constructor();
	void Merge();
	void Print();
	void Process();
private:
	NODE *head1, *head2, *p, *pr, *keep;
	bool first;
};
DATA::DATA()
{
	pr = keep = head1 = head2 = p = NULL;
	first = true;
}
void DATA::Constructor()
{
	if (first)
		cout << "Constructor 1 called !" << endl;
	else
		cout << "Constructor 2 called !" << endl;
	cout << "How Many Numbers Do You Want To Enter ?" << endl << endl;
	int nnum, input;
	cin >> nnum;
	if (nnum != 0)
	{
		p = new NODE;
		cin >> input;
		p->num = input;
		if (first)
			head1 = p;
		else
			head2 = p;
		nnum--;
	}
	while (nnum--)
	{
		p->next = new NODE;
		p = p->next;
		cin >> input;
		p->num = input;
	}
	p->next = NULL;
	first = !first;
}
void DATA::Merge()
{
	cout << "Merge called !" << endl << endl;
	pr = p = head1;
	if (head1->num > head2->num)
	{
		keep = head2->next;
		head1 = head2;
		head2->next = p;
		pr = head2;
		head2 = keep;
	}
	while (1)
	{
		while (p != NULL && p->num <= head2->num)
		{
			pr = p;
			p = p->next;
		}
		if (p == NULL)
		{
			pr->next = head2;
			return;
		}
		else
		{
			keep = head2->next;
			pr->next = head2;
			head2->next = p;
			head2 = keep;
			pr = pr->next;
			if (head2 == NULL)
				return;
		}
	}
}
void DATA::Print()
{
	cout << "Print called !" << endl << endl;
	p = head1;
	while (p != NULL)
	{
		cout << p->num << endl;
		p = p->next;
	}
	cout << endl;
}
void DATA::Process()
{
	p = pr = head1;
	p = p->next;
	while (p != NULL)
	{
		if (p->num == pr->num)
		{
			pr->next = p->next;
			delete p;
			p = pr->next;
		}
		else
		{
			pr = p;
			p = p->next;
		}
	}
}

main.cpp

#include<iostream>
#include"head.h"
using namespace std;
 
int main()
{
	DATA data;
	data.Constructor();
	data.Constructor();
	data.Merge();
//	data.Process();
	data.Print();
	system("pause");
}

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注