数据结构: 顺序表

1. SeqList.h

#pragma once
#include  <iostream>
using namespace std;
#include  <stdlib.h>
//#include "LinearList.h"

int const defaultSize = 100;
template <class T>
class SeqList {
protected:
	T* data;
	int maxSize;
	int last;
	void reSize(int newSize);
public:
	SeqList(int sz = defaultSize);
	SeqList(SeqList<T>& L);
	SeqList() { delete[] data; }
	int Size() const { return maxSize; }
	int Length() const { return last + 1; }
	int Search(T& x) const;
	int Locate(int i) const;
	bool getData(int i, T& x)const {
		if (i > 0 && i <= last + 1) {
			x = data[i - 1];
			return true;
		}
		else {
			return false;
		}
	}
	bool setData(int i, T& x) {
		if (i > 0 && i <= last + 1)
			data[i - 1] = x;
	}
	bool Insert(int i, T& x);
	bool Remove(int i, T& x);
	bool IsEmpty() {
		return (last == -1) ? true : false;
	}
	void input();
	void output();
	SeqList<T> operator= (SeqList<T>& L);
};


2.SeqList.cpp

#include <iostream>
using namespace std;
#include "seqList.h"

template <class T>
SeqList<T>::SeqList(int sz) {
	if (sz > 0) {
		maxSize = sz; last = -1;
		data = new T[maxSize];
		if (data == NULL) {
			{cerr << "存储分配错误!" << endl; exit(1); }
		}
	}
}

template <class T>
SeqList<T>::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;
	}
}

template <class T>
void SeqList<T>::reSize(int newSize) {
	if (newSize <= 0) {
		cerr << "无效的数组大小!" << endl; return;
	}
	if (newSize = maxSize) {
		T* newarray = new T[maxSize];
		if (newarray == NULL) {
			cerr << "存储分配错误!" << endl; exit(1);
		}
		int n = last + 1;
		T* srcptr = data;
		T* destptr = newarray;
		while (n--) {
			*destptr++ = *srcptr++;
			delete[] data;
			data = newarray;
			maxSize = newSize;
		}
	}
}

template <class T>
int SeqList<T>::Search(T& x) const {
	for (int i = 0; i <= last; i++) {
		if (data[i] == x) {
			return i + 1;
		}
	}
	return 0;
}

template <class T>
int SeqList<T>::Locate(int i) const {
	if (i >= 1 && i <= last + 1) {
		return i;
	}
	else {
		return 0;
	}
}

template <class T>
bool SeqList<T>::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 SeqList<T>::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;
}

template <class T>
void SeqList<T>::input() {
	cout << "开始建立顺序表,请输入表中元素最后一个下标:";
	while (1) {
		cin >> last;
		if (last <= maxSize-1) break;
		cout << "表中元素下标输入有误,下标范围不能超过" << maxSize-1 << ": ";
	}
	for (int i = 0; i <= last; i++) {
		cout << i + 1 << endl;
		cin >> data[i];
		
	}
}

template <class T>
void SeqList<T>::output() {
	cout << "顺序表当前元素最后位置为:" << last << endl;
	for (int i = 0; i <= last; i++) {
		cout << "#" << i + 1 << ":" << data[i] << endl;
	}
}

template <class T>
SeqList<T> SeqList<T>::operator=(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;
	}
}

void nuion(SeqList<int>& LA, SeqList<int>& LB) {
	int n = LA.Length(), m = LB.Length(), i, k, x;
	for (i = 0; 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() {
	SeqList<int> A(5);
	A.input();
	A.output();
	SeqList<int> B(8);
	B.input();
	B.output();
	SeqList<int>  C = B;
	C.output();
	nuion(A, B);
	A.output();
	B.output();
	Intersection(B, A);
}

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值