P53.2.(3)将两个递增的有序链表合并为一个递增的有序链表。要求结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间。表中不允许有重复的数据。

一把辛酸泪啊。。。。。。本人之前用的是DEVC++,可能是本人太菜,把这个编译器给整出问题了,一直给我报错,我就把它给卸载了,满以为换上了宇宙第一IDE就会过上幸福快乐的生活,没想到是噩梦的开始。。。。。。。可能是本人太菜用VS2010时非常的刺手,一开始写hello world给我各种报错,我就去找错误源,我的天。。。。。兼容性、语言标准、编译头。。。。。后面写好程序后找bug,我晕哟你给我报的都是些什么错?????0xc00000000005这一类的我看不懂 啊!!!!!!然后又去搜各种VS调试教程,我觉得这三天时间是最艰难的,充分感受到了开发环境的重要性。吐槽归吐槽,不过还是得承认VS远比我想象中强大!调试功能炒鸡棒,虽然一直虐我。。。。。。

 

不说题外话了。这个题的算法比较简单,但是为了调用这个算法以验证它的正确性,我将可能使用的链表的一些操作与之和放在一个project当中,以便以后再写链表相关算法时可以直接调用相关函数而不用再重写基础操作的函数实现新算法。

1.工程文件结构:

P53.2.(3)将两个递增的有序链表合并为一个递增的有序链表。要求结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间。表中不允许有重复的数据。_第1张图片

2.这个题的算法(放在了LinkList.cpp中):

LinkList Get_Intersection_Num(LinkList &La, LinkList &Lb, LinkList &Lc)
{
    if(!La || !Lb)
    {
        cout<<"有空链表,无法求相交元素";
        return NULL;
    }

    LNode *pa, *pb, *pc, *temp;
    Lc = La;
    pa = La -> next;
    pb = Lb -> next;
//    pc = Lc -> next;

    while(pa && pb)
    {
        if(pa -> data == pb -> data)
        {
//             pc = pa;            

            temp = pb;
            pa = pa -> next;
            pb = pb -> next;
        }
        else if(pa -> data > pb -> data)
        {
            temp = pb;
            pb = pb -> next;
        }
        else
        {
            temp = pa;
            pa = pa -> next;
        }
        free(temp);
        temp = NULL;
    }
    while(pa)
    {
        temp = pa;
        pa = pa -> next;
        free(temp);
    }
    while(pb)
    {
        temp = pb;
        pb = pb -> next;
        free(temp);
    }
    return Lc;
}

3.main.cpp文件内容:

#include 
#include 
#include "LinkList.h"


using namespace std;

int main()
{
	LinkList L1, L2, L3;
	int len1, len2;

	cout<<"\n输入L1链表的长度:";
	cin>>len1;
	Creat_LinkList(L1, len1);
//	cout<<"\n打印L1元素:";
//	PrintLinkList(L1);

	cout<<"\n输入L2链表的长度";
	cin>>len2;
	Creat_LinkList(L2, len2);
//	cout<<"\n打印L2元素:";
//	PrintLinkList(L2);

	Get_Intersection_Num(L1, L2, L3);
	cout<<"\n打印交集中的元素:\n";
	PrintLinkList(L3);


	system("PAUSE");
}

3.LinkList.h文件内容:

#ifndef LINKLIST_H
#define LINKLIST_H

const int TRUE = 1;
const int FALSE = 0;
typedef int Status;

typedef struct node 
{
	int data;
	node* next;
	int length;
}LNode, *LinkList;

void Creat_LinkList(LinkList &L, int len);
void Mesh_LinkLists(LinkList &L1, LinkList &L2);//L1和L2为递增序列,都有头结点,将L2中的值按序插入L1中 
LinkList Get_Intersection_Num(LinkList &La, LinkList &Lb, LinkList &Lc);
void PrintLinkList(LinkList &L);

#endif

4.LinkList.cpp文件内容(包含了创建链表,打印链表元素等操作)

#include 
#include 
#include "LinkList.h"

using namespace std;
void Creat_LinkList(LinkList &L, int len)
{ 
	if(len <= 0)
	{
		cout<<"\n数据不合法!";
		exit(1);
	}
	
	int temp;
	LNode* head; 
	LNode* p; 
	
	//建立空链表 
	head = new LNode;
	head -> next = NULL;
	head -> length = len;

	L = head;
	p = head;
	
	//输入数据存入链表 
	cout<<"\n输入链表元素:";
	for(int i = 0; i < len; i++)
	{
		
		LNode* new_node = new LNode;
		cin>>temp;
		new_node -> data = temp;
		new_node -> next = NULL;
		new_node -> length = len;

		p -> next = new_node;
		p = p -> next; 
	}
	
	return;
}

void Mesh_LinkLists(LinkList &L1, LinkList &L2)//L1和L2为递增序列,都有头结点,将L2中的值按序插入L1中 
{
	if(!L1)//L1为空链表 
	{
		L1 = L2;
		return;
	}

	LinkList p1, p2, p3;
	p1 = L1 -> next;
	p2 = L2 -> next;
	p3 = L1;
	
	while(p1 && p2)
	{
		if(p1 -> data <= p2 -> data)
		{
			p3 -> next = p1;
			p1 = p1 -> next;
		}
		else 
		{
			p3 -> next = p2;
			p2 = p2 -> next;
		}
		p3 = p3 -> next;
	}
	
	//长链表较短链表多出的部分接在合成链表的后面 
	if(p1 != NULL)
	{
		p3 -> next = p1;
	}
	if(p2 != NULL)
	{
		p3 -> next = p2;
	}
	return; 
}


LinkList Get_Intersection_Num(LinkList &La, LinkList &Lb, LinkList &Lc)
{
	if(!La || !Lb)
	{
		cout<<"有空链表,无法求相交元素";
		return NULL;
	}

	LNode *pa, *pb, *pc, *temp;
	Lc = La;
	pa = La -> next;
	pb = Lb -> next;
//	pc = Lc -> next;

	while(pa && pb)
	{
		if(pa -> data == pb -> data)
		{
//	 		pc = pa;			

			temp = pb;
			pa = pa -> next;
			pb = pb -> next;
		}
		else if(pa -> data > pb -> data)
		{
			temp = pb;
			pb = pb -> next;
		}
		else
		{
			temp = pa;
			pa = pa -> next;
		}
		free(temp);
		temp = NULL;
	}
	while(pa)
	{
		temp = pa;
		pa = pa -> next;
		free(temp);
	}
	while(pb)
	{
		temp = pb;
		pb = pb -> next;
		free(temp);
	}
	return Lc;
}


void PrintLinkList(LinkList &L)
{
	LinkList p;
	p = L -> next ;
	
	while(p != NULL)
	{
		cout<

data< next; } return; }

5.测试结果: 

P53.2.(3)将两个递增的有序链表合并为一个递增的有序链表。要求结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间。表中不允许有重复的数据。_第2张图片

你可能感兴趣的:(数据结构基础)