第四周 項目 3 - 單鏈表應用 (2)

list.h 代碼

/*
*Copyright (c) 2017,煙臺大學計算機與控制工程學院
*All rights reserved.
*文件名稱:
*作    者:陳軍正
*完成日期:2017年10月10日
*版 本 號:v1.0
*
*已知 L1 和 L2 分別指向兩個單鏈表的頭結點, 且已知其長度分別爲 m、 n, 請設計算法
*將 L2 連接到 L1 的後面。 實現這個算法, 完成測試, 並分析這個算法的複雜度。
*/
typedef struct LNode
{
	int data;
	struct LNode *next;
}LinkList;
void CreateList(LinkList *&L,int a[],int n );
void DisplyList(LinkList *&L);
void DestroyList(LinkList *&L);
void Reverse(LinkList *&L);
void Link(LinkList *&L1, LinkList *&L2);

main.cpp 代碼

#include <iostream>
#include <list.h>
using namespace std;

int main()
{
	int a[6] = { 1,2,3,4,5,6 };
	int b[6] = { 1,2,3,4,5,6 };
	LinkList *L, *S;
	CreateList(L, a, 6);
	CreateList(S, b, 6);
	cout << "兩個兩鏈表爲:";
	DisplyList(L);
	cout << endl;
	DisplyList(S);
	cout << "合併後:";
	Link(L, S);
	DisplyList(L);
	system("pause");
		return 0;
}

list.cpp 代碼

#include <list.h>
#include <iostream>
#include <malloc.h>
using namespace std;

void CreateList(LinkList *&L,int a[], int n)
{
	LinkList *S;
	L = (LinkList *)malloc(sizeof(LinkList));
	int i;
	L->next = NULL;
	for (i = 0; i<n; ++i)
	{
		S = (LinkList *)malloc(sizeof(LinkList));
		S->data = a[i];
		S->next = L->next;
		L->next = S;
	}
}

void DisplyList(LinkList *&L)
{
	LinkList *p;
	p = L->next;
	while (p != NULL)
	{
		cout << p->data << " ";
		p = p->next;
	}
}
void Reverse(LinkList *&L)
{
	LinkList *p = L->next, *q;
	L->next = NULL;
	while (p!=NULL)
	{
		q = p->next;
		p->next = L->next;
		L->next = p;
		p = q;
	}
}

void DestroyList(LinkList *&L)
{
	LinkList *p = L, *q=p->next;
	while (q != NULL)
	{
		free(p);
		q = p->next;
	}
	free(p);
}
void Link(LinkList *&L1, LinkList *&L2)
{
	LinkList *p = L1;
	while (p->next != NULL)   //找到L1的尾節點
		p = p->next;
	p->next = L2->next;  //將L2的首個數據節點連接到L1的尾節點後
	free(L2);   //釋放掉已經無用的L2的頭節點
}
運行結果

總結:學習兩個鏈表的鏈接,複雜度爲O(n)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章