数据结构C++版链式表

代码实现:

//链式表
#include<iostream>
using namespace std;
struct LinkNode {
	int data;
	LinkNode* link;
	LinkNode(LinkNode* ptr = NULL) {
		link = ptr;
	}
	LinkNode(const int& item, LinkNode* ptr = NULL) {
		data = item;
		link = ptr;
	}
};
class List {
public:
	List() {
		first = new LinkNode;
	}
	List(const int& x) {
		first = new LinkNode(x);
	}
	List(List& L) {
		int value;
		LinkNode* srcptr = L.getHead();
		LinkNode* destptr = first = new LinkNode;
		while (srcptr->link != NULL) {
			value = srcptr->link->data;
			destptr->link = new LinkNode(value);
			destptr = destptr->link;
			srcptr = srcptr->link;
		}
		destptr->link = NULL;
	}
	~List() {
		makeEmpty();
	}
	void makeEmpty() {
		LinkNode* ptr;
		while (first->link != NULL) {
			ptr = first->link;
			first->link = ptr->link;
			delete ptr;
		}
	}
	int Length()const {
		LinkNode* ptr = first->link;
		int count = 0;
		while (ptr != NULL) {
			count++;
			ptr = ptr->link;
		}
		return count;
	}
	LinkNode* getHead()const {
		return first;
	}
	LinkNode* search(int x) {
		LinkNode* ptr = first->link;
		while (ptr != NULL) {
			if (ptr->data == x) return ptr;
			ptr = ptr->link;
		}
		return NULL;
	}
	LinkNode* Locate(int i)const {
		if (i <0)return NULL;
		if (i == 0)return first;
		LinkNode* ptr = first;
		int k = 0;
		while (ptr != NULL && k < i) {
			ptr = ptr->link;
			k++;
		}
		return ptr;
	}
	bool getData(int i, int& x)const {
		if (i <= 0)return false;
		LinkNode* ptr = Locate(i);
		if (ptr == NULL)return false;
		else {
			x = ptr->data;
			return true;
		}
	}
	void setData(int i, int& x) {
		if (i <= 0)return;
		LinkNode* ptr = Locate(i);
		if (ptr == NULL)return;
		ptr->data = x;
	}
	bool Insert(int i, int& x) {
		if (i <= 0)return false;
		LinkNode* ptr = Locate(i);
		if (ptr == NULL)return false;
		LinkNode* str = new LinkNode(x);
		if (str == NULL) {
			cerr << "分配存储空间失败!" << endl;
			exit(1);
		}
		str->link = ptr->link;
		ptr->link = str;
		return true;
	}
	bool Remove(int i, int& x) {
		if (i <= 0)return false;
		LinkNode* ptr = Locate(i - 1);
		LinkNode* str = Locate(i);
		if (str == NULL)return false;
		ptr->link = str->link;
		delete str;
		return true;
	}
	bool IsEmpty()const {
		return first->link == NULL ? true : false;
	}
	bool IsFull()const {
		return false;
	}
	void input() {
		int i,k;
		cout << "请输入想要输入的元素个数:" << endl;
		cin >> k;
		cout << "请输入建立链表的方式:" << endl;
		cout << "前插式       1" << endl;
		cout << "后插式       2" << endl;
		cin >> i;
		switch (i)
		{
		case 1:h_input(k); break;
		case 2:b_input(k); break;
		default:cout << "输入错误!!!" << endl;
			break;
		}
	}
	void output() {
		LinkNode* ptr = first->link;
		int i = 1;
		while (ptr != NULL) {
			cout << "第" << i << "个元素:" << ptr->data;
			ptr = ptr->link;
			i++;
			cout << endl;
		}
	}
private:
	LinkNode* first;
	void h_input(int i) {
		int k, z = i;
		while (i--) {
			cout << "请输入第" << i+1 << "个元素的值:";
			cin >> k;
			LinkNode* ptr = new LinkNode(k);
			ptr->link = first->link;
			first->link = ptr;
			cout << endl;
		}
	}
	void b_input(int i) {
		int k, z = i;
		LinkNode* ptr = first;
		while (i--) {
			cout << "请输入第" << z - i << "个元素的值:";
			cin >> k;
			LinkNode* str = new LinkNode(k);
			ptr->link = str;
			ptr = str;
			cout << endl;
		}
	}
};

链式表的交、并操作:

void hebing(List& LA, List& LB) {
	int n = LA.Length();
	int m = LB.Length();
	int i, x;
	for (i = 1; i <= m; i++) {
		LB.getData(i, x);
		if (LA.search(x) == NULL) {
			LA.Insert(n, x);
			n++;
		}
	}
}
void qujiao(List& LA, List& LB) {
	int n = LA.Length();
	int m = LB.Length();
	cout << "LA:" << n << endl;
	cout << "LB:" << m << endl;
	int x,i=1;
	while (i <= n) {
		LA.getData(i, x);
		if (LB.search(x) == NULL) {
			LA.Remove(i, x);
			n--;
		}
		else i++;
	}
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值