您的位置:首页 > 其它

1004_线性表操作

2016-02-28 16:45 260 查看
比赛描述

线性表是n个元素的有序集合(n≥0),n是线性表中元素的个数,称为线性表的长度。可以用一组地址连续的存储单元依次存储线性表中元素,采用这种存储方式的线性表称为顺序表。

请在顺序表上实现运算,实现顺序表的逆置,删除表中所有元素值等于x的元素。

输入

三组数据,顺序表元素类型分别为整型、字符型和实型。

每一组第一行给出元素数目n(0<n≤1000),第二行给出元素数值,第三行给出待删除的元素。

输出

三组数据,每一组第一行给出逆置后的顺序表元素,第二行是在此基础上删除指定元素后的顺序表元素,每一个输出元素后均有一个空格,如果元素全部被删除,那么输出一个空行。

样例输入

8

1 2 3 7 5 6 7 8

7

3

a c m

h

4

1.2 3.4 5.6 7.8

1.2

样例输出

8 7 6 5 7 3 2 1

8 6 5 3 2 1

m c a

m c a

7.8 5.6 3.4 1.2

7.8 5.6 3.4

先看如下代码:

#include <iostream>
using namespace std;

int main()
{
	int n1, n2, n3;
	int da, *a;
	char db, *b;
	double dc, *c;

	cin >> n1;
	a = new int[n1];
	for (int i = 0; i < n1; i++)
		cin >> a[i];
	cin >> da;

	cin >> n2;
	b = new char[n2];
	for (int i = 0; i < n2; i++)
		cin >> b[i];
	cin >> db;

	cin >> n3;
	c = new double[n3];
	for (int i = 0; i < n3; i++)
		cin >> c[i];
	cin >> dc;

	for (int i = n1 - 1; i >= 0; i--)
		cout << a[i] << " ";
	cout << endl;
	for (int i = n1 - 1; i >= 0; i--)
	{
		if (a[i] != da)
			cout << a[i] << " ";
	}
	cout << endl;

	for (int i = n2 - 1; i >= 0; i--)
		cout << b[i] << " ";
	cout << endl;
	for (int i = n2 - 1; i >= 0; i--)
	{
		if (b[i] != db)
			cout << b[i] << " ";
	}
	cout << endl;

	for (int i = n3 - 1; i >= 0; i--)
		cout << c[i] << " ";
	cout << endl;
	for (int i = n3 - 1; i >= 0; i--)
	{
		if (c[i] != dc)
			cout << c[i] << " ";
	}
	cout << endl;

	delete[]a;
	delete[]b;
	delete[]c;
	return 0;
}
运行结果:





注意事项:

1.顺序表采用动态内存分配。

2.程序最后要释放内存。

代码分析:虽然此法能够按照要求输入输出,但实质上线性表并没有完成逆置,和元素删除。有点投机取巧

再看如下代码:

#include <iostream>
using namespace std;

template <typename T>
class MyList
{
public:
	MyList();										//默认构造函数初始化线性表
	~MyList();
	void ShowList();								//输出 线性表
	void ReverseList();							//调转线性表
	void DelElemetAndShow();			//删除元素并且输出
private:
	T * list;
	T delet;											//要删除的数据
	int len;											//当前长度			
	static const int MaxSize=1000;		//最大长度
};

template <typename T>
MyList<T>::MyList()
{
	int le;
	cin >> le;
	len = le;
	list = new T[le];
	int i = 0;
	while (cin>>list[i])
	{
		i++;
		if (i > len - 1)
			break;
	}
	cin >> delet;
}

template <typename T>
MyList<T>::~MyList()
{
	delete[]list;
}

template <typename T>
void MyList<T>::ShowList()
{
	for (int i = 0; i < len; i++)
		cout << list[i] << " ";
	cout << endl;
}

template <typename T>
void MyList<T>::ReverseList()
{
	for (int i = 0;i<len-i-1; i++)
	{
		T temp;
		temp = list[i];
		list[i] = list[len - i - 1];
		list[len - i - 1] = temp;
	}
}

template <typename T>
void MyList<T>::DelElemetAndShow()
{
	int n=0;						//用以记录ele数目
	for (int i = 0; i < len; i++)
	{
		if (list[i] == delet)
			n++;
		else
			list[i - n] = list[i];
	}
	len -= n;
	if (n == len)
		cout << endl;
	else
		ShowList();
}

template <typename T>
void ACM1004()
{
	MyList<T> a;
	a.ReverseList();
	a.ShowList();
	a.DelElemetAndShow();
}

int main()
{
	ACM1004<int>();
	ACM1004<char>();
	ACM1004<double>();
	return 0;
}
代码分析:

1.采用类模板,对三种不同类型进行重载

2.析构函数用delete对内存进行了释放

3.是在顺序表上实现的,单链表实现请转到http://blog.csdn.net/changshu1/article/details/47251969

知识点整理:

1.类模板的使用/article/3703094.html

2.数据结构线性表C++表示/article/3703096.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: