代码实现:
//链式表
#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++;
}
}