1. 程式人生 > >【資料結構 C描述】有兩個整數集合 A 和 B 分別用兩個線性表 LA 和 LB 表示,求:一個新的集合A=A∪B,A仍然為純集合,線性表採用鏈式儲存方式。【單鏈表】

【資料結構 C描述】有兩個整數集合 A 和 B 分別用兩個線性表 LA 和 LB 表示,求:一個新的集合A=A∪B,A仍然為純集合,線性表採用鏈式儲存方式。【單鏈表】

這是我的作業題,作業寫完後再附到部落格中,可能程式碼寫得很爛。雖然是C語言寫的,但是我在其中加入了C++的寫法,例如cout。我懶得寫printf的格式控制符,所以用cout來輸出內容,這樣我感覺簡便多了

題目

假設:有兩個整數集合 A 和 B 分別用兩個線性表 LA 和 LB 表示,即:線性表中的資料元素即為集合中的成員。(A/B為純集合) 要求:一個新的集合A=A∪B,A仍然為純集合,線性表採用鏈式儲存方式。

該實驗內容以“int”作為線性表資料元素的資料型別。 在這裡插入圖片描述

程式碼:

//main.cpp
#include <iostream>
#include "ListNode.h"
using namespace std;

int main()
{
	ListNode *LA,*LB;
	InitList(LA);
	InitList(LB);
	int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int b[10] = { 34, 1, 9, 32, 12, 8, 99, 60, 3, 4};
	
	//CreateListF(L, a, 10);
	cout << "集合A:";
	CreateListR(LA, a, 10);		//尾插法
	DispList(LA);

	cout << "集合B:";
	CreateListR(LB, b, 10);
	DispList(LB);
	cout << "集合A = A U B :";

	/*
	 *(1)根據題幹要求,可用兩個連結串列物件分別表示兩個集合;
	 *(2)逐個取集合B的元素ei,與集合A中的每個元素進行比較,如果ei不在A中,則將ei插入到集合A中;
	*/
	int LB_Elem = 0;		//表B的一個元素
	int LA_Elem = 0;		//表A的一個元素
	for (int i = 1; i < ListLength(LB); i++) {		//遍歷LB中的元素
		GetElem(LB, i, LB_Elem);			//獲取LB中的元素LB_Elem
		if (!isEqual(LA, i, LB_Elem))		//判斷LB_Elem是否與LA中的第i個元素相等
		{
			ListInsert(LA, i, LB_Elem);		//將LB中的元素插到LA中
		}
	}

	/*
	*這個方法有問題   沒有與A中的每一個元素進行比較   只比較了第一個元素
	*
	
	for (int i = 0; i < ListLength(LB); i++) {//遍歷LB中的元素
		GetElem(LB, i, LB_Elem);	//獲取LB中的元素LB_Elem
		for (int j = 0; j < ListLength(LA); j++) {	//遍歷LA中的元素
			GetElem(LA, j, LA_Elem);	//獲取LA中的元素LA_Elem
			if (LB_Elem != LA_Elem) {	//如果LB中的元素不等於LA中的元素
				ListInsert(LA, j, LB_Elem);		//將LB中的元素插到LA中
		}

		}
	}
	*/


	DispList(LA);

	DestoryList(LA);
	DestoryList(LB);
	system("pause");
	return 0;
}

ListNode.h

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

typedef int ElemType;

typedef struct LNode {
	ElemType data;
	struct LNode *next;
}ListNode;



/*
//頭插法
void CreateListF(ListNode *&L, ElemType a[], int n) {
	ListNode *s;
	L = (ListNode *)malloc(sizeof(ListNode));
	L->next = NULL;
	for (int i = 0; i < n; i++) {
		s = (ListNode *)malloc(sizeof(ListNode));
		s->data = a[i];
		s->next = L->next;
		L->next = s;
	}
}
*/

	//尾插法
void CreateListR(ListNode *&L, ElemType a[], int n) {
	ListNode *r, *s;
	L = (ListNode *)malloc(sizeof(ListNode));
	r = L;
	for (int i = 0; i < n; i++) {
		s = (ListNode*)malloc(sizeof(ListNode));
		s->data = a[i];
		r->next = s;
		r = s;
	}
	r->next = NULL;
}



void InitList(ListNode *&L) {
	L = (ListNode *)malloc(sizeof(ListNode));
	L->next = NULL;
}

/*
*過程:讓pre 和 p 指向相鄰的兩個節點(初始時pre指向頭節點,p指向首節點)
*當p不為空時迴圈
*釋放節點pre,然後pre,p同步往後移一個結點
*迴圈結束後pre指向尾結點
*釋放掉pre
*/
void DestoryList(ListNode *&L) {
	ListNode *pre = L, *p = L->next;
	while (p != NULL) {
		free(pre);		//釋放節點pre
		pre = p;		//pre往後移一個結點
		p = pre->next;		//p同步往後移一個結點
	}
	free(pre);
}

bool ListEmpty(ListNode *L) {
	return(L->next == NULL);
}

void DispList(ListNode *L) {
	ListNode *p = L->next;		//p指向首節點
	while (p != NULL) {
		cout << p->data << " ";		//輸出p指向的資料域
		p = p->next;		//p指向下一個節點
	}
	cout << "\n";
}

int ListLength(ListNode *L) {
	int counter_Node = 0;		//用來統計節點的個數
	ListNode *p = L;		//指標p指向頭節點L
	while (p != NULL) {
		counter_Node++;
		p = p->next;		//p指向下一個節點
	}
	return counter_Node;
}


bool GetElem(ListNode *L, int i, ElemType &e) {
	int counter_Node = 0;		//用來統計遍歷過的節點的個數
	ListNode *p = L;
	if (i <= 0 ) return false;		//判斷要獲取的元素是否在範圍內
	while (counter_Node < i && p != NULL) {
		counter_Node++;
		p = p->next;		//p指向下一個節點
	}
	if (p == NULL) return false;
	else {
		e = p->data;		//把p指向的資料域給e
		return true;
	}
}

/*
 *在單鏈表L中從頭開始找第一個至於與e相等的節點,若存在,則返回邏輯序號,
 *否則返回0
 */
int LocateElem(ListNode *L, ElemType e) {
	int i = 1;		//用於表示首節點的序號
	ListNode *p = L->next;		//指標p指向首節點
	while (p != NULL && p->data != e) {		//當指標p不為空和p的資料域不為空的時候迴圈
		p = p->next;		//p指向下一個節點
		i++;
	}
	if (p == NULL) return 0;
	else return i;
}

bool ListInsert(ListNode *&L, int i, ElemType e) {
	int j = 0;		//用於表示頭結點的位置
	ListNode *p = L, *s;
	if (i <= 0) return false;
	while (j < i - 1 && p != NULL) {
		j++;
		p = p->next;		//p節點向後移一位
	}
	if (p == NULL) return false;
	else {
		s = (ListNode *)malloc(sizeof(ListNode));
		s->data = e;		//把要插入的節點e的放到s指向的資料域裡
		s->next = p->next;
		p->next = s;
		return true;
	}

}

bool ListDelete(ListNode *&L, int i, ElemType e) {
	int j = 0;		//記錄頭節點
	ListNode *p = L, *q;
	if (i <= 0) return false;
	while (j < i - 1 && p != NULL) {		//查詢第i-1個節點
		j++;
		p = p->next;
	}
	if (p == NULL) return false;
	else {
		q = p->next;		//q指向第i個節點
		if (q == NULL) {
			return false;
		}
		e = q->data;		//將要刪除的資料放到e中,待作其他用途,例如輸出它
		p->next = q->next;		//p指標指向下下個節點
		free(q);
		return true;
	}

}


/*
*ListElem表示LA中的元素
*judgeElem表示獲取到LB中的元素
*/
//判斷jugdeElem是否與表L中的每個ListElem元素相同
//相同返回true   否則返回false
bool isEqual(ListNode *L, int ListElem, int judgeElem) {

	for (int i = 0; i < ListLength(L); i++) {
		GetElem(L, i, ListElem);
		if (judgeElem == ListElem) {
			return true;
		}
	}
	return false;
}

執行截圖 在這裡插入圖片描述