【数据结构 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”作为线性表数据元素的数据类型。
【数据结构 C描述】有两个整数集合 A 和 B 分别用两个线性表 LA 和 LB 表示,求:一个新的集合A=A∪B,A仍然为纯集合,线性表采用链式存储方式。【单链表】

代码:

//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中
		}
	}
	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;
}

运行截图
【数据结构 C描述】有两个整数集合 A 和 B 分别用两个线性表 LA 和 LB 表示,求:一个新的集合A=A∪B,A仍然为纯集合,线性表采用链式存储方式。【单链表】