64,642
社区成员
发帖
与我相关
我的任务
分享
#include<iostream>
#include<stdlib.h>
const int defaultSize = 100;
using namespace std;
template<class T>
class LinearList {
public:
//LinearList();
//~LinearList();
virtual int Size() const = 0;
virtual int Length() const = 0;
virtual int Search(T& x) const = 0;
virtual int Locate(int i) const = 0;
virtual bool getData(int i,T& x) const = 0;
virtual void setData(int i,T &x) = 0;
virtual bool Insert(int i,T&x) = 0;
virtual bool Remove(int i,T& x) = 0;
virtual bool IsEmpty() const = 0;
virtual bool IsFull() const = 0;
virtual void Sort() = 0;
virtual void input() = 0;
virtual void output() = 0;
};
template<class T> //顺序表
class SeqList : public LinearList<T> {
protected:
T *data;
int maxSize;
int last;
public:
SeqList(int sz) {
if(sz > 0) {
maxSize = sz;
last = -1;
data = new T[maxSize];
if(data == NULL) {
cerr << "存储分配错误!" << endl;
exit(1);
}
}
}
SeqList(SeqList<T> &L) {
maxSize = L.Size();
last = L.Length() - 1;
T value;
data = new T[maxSize];
if(data == NULL) {
cerr << "存储分配错误!" << endl;
exit(1);
}
for(int i=1; i<=last+1; i++) {
L.getData(i, value);
data[i-1] = value;
}
}
~SeqList() {
delete []data;
}
int Size() const {
return maxSize;
}
int Length() const {
return last+1;
}
// template<class T>
int Search(T &x) const {
for(int i=0; i<=last; i++)
if(data[i] == x)
return i + 1;
return 0;
}
int Locate(int i) const {
if(i >= 1 && i <= last + 1)
return i;
return 0;
}
bool getData(int i, T &x) const {
if(i > 0 && i <= last + 1) {
x = data[i - 1];
return true;
}
return false;
}
void setData(int i, T &x) {
if(i > 0 && i <= last + 1)
data[i-1] = x;
}
// template<class T>
bool Insert(int i, T &x) {
if(last == maxSize - 1)
return false;
if(i < 0 || i > last + 1)
return false;
for(int j=last; j>=i; j--)
data[j + 1] = data[j];
data[i] = x;
last++;
return true;
}
// template<class T>
bool Remove(int i, T &x) {
if(last == -1)
return false;
if(i < 1 || i > last + 1)
return false;
x = data[i - 1];
for(int j=i; j<=last; j++)
data[j - 1] = data[j];
last--;
return true;
}
bool IsEmpty() const {
return (last == -1) ? true : false;
}
bool IsFull() const {
return (last == maxSize - 1) ? true : false;
}
void Sort() {};
void input() {
cout << "开始建立顺序表,请输入表中元素个数:";
while(1) {
cin >> last;
if(last <= maxSize - 1)
break;
cout << "表中元素输入有误,范围不能超过" << maxSize - 1 << ":";
}
for(int i=0; i<=last; i++) {
cin >> data[i];
cout << i + 1 << endl;
}
}
void output() {
cout << "顺序表当前元素最后位置为:" << last << endl;
for(int i=0; i<=last; i++)
cout << "#" << i + 1 << ":" << data[i] << endl;
}
// SeqList<T>operator=(SqeList<T>&L);
};
template<class T > //单链表
struct LinkNode{
T data;
LinkNode<T> *link;
LinkNode(LinkNode<T> *ptr = NULL) {
link = ptr;
}
LinkNode(const T &item, LinkNode<T> *ptr = NULL) {
data = item;
link = ptr;
}
};
template<class T>
class List : public LinearList<T> {
public:
List() {
first = new LinkNode<T>;
}
List(const T &x) {
first = new LinkNode<T>(x);
}
List(List<T> &L) {
T value;
LinkNode<T> *scrptr = L.getHead();
LinkNode<T> *desptr = first = new LinkNode<T>;
while(srcptr->link != NULL) {
value = srcptr->link->data;
destptr = destptr->link;
srcptr = srcptr->link;
destptr->link = NULL;
}
}
~List() {
makeEmpty();
}
void makeEmpty() {
LinkNode<T> *q;
while(first->link != NULL) {
q = first->link;
first->link = q->link;
delete q;
}
}
int Length() const {
LinkNode<T> *p = first->link;
int count = 0;
while(p != NULL) {
p = p->link;
count++;
}
return count;
}
LinkNode<T> *getHead() const {
return false;
}
LinkNode<T> * Search(T x) {
LinkNode<T> *current = first->link;
while(current != NULL)
if(current->data == x)
break;
else current = current->link;
return current;
}
LinkNode<T> *Locate(int i) {
if(i < 0)
return NULL;
LinkNode<T> *current = first;
int k = 0;
while(current != NULL && k < i) {
current = current->link;
k++;
}
return current;
}
bool getData(int i, T &x) const {
if(i <= 0)
return NULL;
LinkNode<T> *current = Locate(i);
if(current == NULL)
return false;
else {
x = current->data;
return false;
}
}
void setData(int i, T &x) {
if(i <= 0)
return;
LinkNode<T> *current = Locate(i);
if(current == NULL)
return;
current->data = x;
}
bool Insert(int i, T &x) {
LinkNode<T> *current = Locate(i);
if(current == NULL)
return false;
LinkNode<T> *newNode = new LinkNode<T>(x);
if(newNode == NULL) {
cerr << "存储分配错误!" << endl;
exit(1);
}
newNode->link = current->link;
current->link = newNode;
return true;
}
bool Remove(int i, T &x) {
LinkNode<T> *current = Locate(i - 1);
if(current == NULL || current->link == NULL)
return false;
LinkNode<T> *del = current->link;
current->link = del->link;
x = del->data;
delete del;
return true;
}
bool IsEmpty() const {
return first->link == NULL ? true : false;
}
bool IsFull() const {
return false;
}
void input(T endTag) {
LinkNode<T> *newNode, *last;
T val;
makeEmpty();
cin >> val;
last = first;
while(val != endTag) {
newNode = new LinkNode<T>(val);
if(newNode == NULL) {
cerr << "存储分配错误!" << endl;
exit(1);
}
last->link = newNode;
last = newNode;
cin >> val;
}
last->link = NULL;
}
void output() {
LinkNode<T> *current = first->link;
while(current != NULL) {
cout << current->data << endl;
current = current->link;
}
}
// List<T>operator=(List<T>&L);
protected:
LinkNode<T> *first;
};
void Union(SeqList<int> &LA, SeqList<int> &LB) {
int n = LA.Length(), m = LB.Length(), i, x, k;
for(i=1; i<=m; i++) {
LB.getData(i, x);
k = LA.Search(x);
if(k == 0) {
LA.Insert(n, x);
n++;
}
}
};
void Intersection(SeqList<int> &LA, SeqList<int> &LB) {
int n = LA.Length(), m = LB.Length(), i = 1, k, x;
while(i <= n) {
LA.getData(i, x);
k = LB.Search(x);
if(k == 0) {
LA.Remove(i, x);
n--;
}
else
i++;
}
};
int main() {
int x;
cout << "进入顺序表输入1,进入单链表输入2" << endl;
cin >> x;
if(x == 1) {
SeqList<int> a(100), b(50);
a.input();
b.input();
}
return 0;
}