(2011.09.09 )2_a2.cpp -- 顺序表 -- 过滤顺序表中的元素

 

// 2_a2.cpp -- 过滤顺序表中的元素

/*
 * 程序要求:
 * 一个顺序表中存放字符(只有数字字符和英文字符),编写算法删除所有的数字字符。
 * 此题的源程序保存为 2_a2.cpp。
 */

/*
 * 要求分析:
 * 1.使用顺序表实现。
 * 2.顺序表中的元素类型为字符。
 * 3.建立一个判断字符类型的函数,或可直接用cctype.
 *   删除所有数字字符,由于顺序表中即有数字又有英文,那么,首先想到的是遍历链表筛选。
 *   也可以考虑用散列表的方法,有可能添删效率会更高。
 *   树形结构估计此时不是很适合。
 * 4.存名为 2_a2.cpp.
 */


#include <iostream>
#include <conio.h>
#include <cctype>
using std::cin;
using std::cout;
using std::endl;
using std::cerr;

// class sqlist
template <typename elem> 
class sqlist
{
private:
	int maxSize;
	int listSize;
	int fence;
	elem * listArray;

public:
	// Constructor
	sqlist():maxSize(20), listSize(0), fence(0), listArray(new elem[maxSize]){}
	sqlist(int ms):maxSize(ms), listSize(0), fence(0), listArray(new elem[ms]){}

	// Destructor
	~sqlist(){ clear(); }

	// Copy
	void clear();
	sqlist(const sqlist<elem>& rhs);
	sqlist& operator = (const sqlist<elem>& rhs);

	// SomeFunction
	int getListSize()	{ return listSize;}
	int getMaxSize()	{ return MaxSize;}
	elem getElem()		{ return listArray[fence];}

	void setStart()		{ fence = 0; }
	void setEnd()		{ fence = listSize; }
	bool isFull()		{ return listSize == maxSize; }
	bool isEmpty()		{ return 0 == listSize; }

	bool insert(elem x);
	bool find();
	bool del();
	void print();
};


// class define
template <typename elem> 
void sqlist<elem>::clear()
{
	delete [] listArray;
}
/*
template <typename elem> 
sqlist sqlist<elem>::sqlist(const sqlist<elem> & rhs)
{
//	return rhs;
}

template <typename elem> 
sqlist& sqlist<elem>::operator = (const sqlist<elem> & rhs)
{
//	return rhs;
}
*/

template <typename elem>
bool sqlist<elem>::insert(elem x)
{
	if(isFull())	return false;
	listArray[listSize] = x;
	++listSize;
	return true;
}

template <typename elem>
bool sqlist<elem>::find()
{
	if (isEmpty() ) return false;
	fence = 0;
	while(fence < maxSize)
	{
		// 寻找数字,返回真
		if (isdigit(listArray[fence]) )
			return true;
		++fence;
	}
	return false;
}

template <typename elem>
bool sqlist<elem>::del()
{
	if (isEmpty() ) return false;
	// 这次设计的del需要配合find函数使用
	int i(fence);
	for (; i != listSize - 1; i++)
	{
		listArray[i] = listArray[i + 1];
	}
	listSize--;
	return true;
}

template <typename elem>
void sqlist<elem>::print()
{
	if (isEmpty()) return;
	for (fence = 0; fence != listSize; fence++)
		cout << listArray[fence]  << ' ';
	return;
}


// main function
int main()
{
	cout << "O(∩_∩)O 开始测试。。。。。。。。。。。。。。。。。\a\n";
	const int MaxSize = 9;
	char temp;
	sqlist<char> test(MaxSize);			// 创建一个长度为13的顺序表

// 循环,单数插入数字字符,双数插入字母字符
	bool insert(sqlist<char> & list, int size);
	cout << "\n——————正在尝试插入字符,创建线性表...\n";
	if(	insert(test, MaxSize))
		cout << "\n——————创建成功——————\n";
	else
		cout << "\n——————创建失败——————\n";

	cout << "\n——————正在遍历顺序表........\n";
	cout << "顺序表长度为 " << test.getListSize();
	cout << "元素有:";
	test.print();
	cout << "请按任意键继续...";
	temp = _getch();

// 删除数字
	bool del(sqlist<char>& list, int size);
	cout << "\n\n——————正在实现删除数字操作...\n";
	if(	del(test,MaxSize))
		cout << "\n——————删除成功——————\n";
	else
		cout << "\n——————删除失败——————\n";

	cout << "\n——————正在遍历顺序表........\n";
	cout << "顺序表长度为 " << test.getListSize();
	cout << "元素有:";
	test.print();
	cout << "请按任意键退出...";
	temp = _getch();

	return 0;
}

// 循环,单数插入数字字符,双数插入字母字符
bool insert(sqlist<char> & list, int size)
{
	int i(0);
	char tempc('a');
	char tempi('1');
	if (list.isFull()) return false;
	for (; i != size; ++tempc, ++tempi, ++i)
	{
		if (i % 2 == 0)
		{
			list.insert(tempc);
			cout << "\n成功在位置 " << i + 1 << "上插入字符 " << tempc << endl;
		}
		else
		{
			list.insert(tempi);
			cout << "\n成功在位置 " << i + 1 << "上插入字符 " << tempi << endl;
		}
	}
	return true;
}
	

// 删除数字
bool del(sqlist<char>& list, int size)
{
	if (list.isEmpty()) return false;
	int i(0);			// 执行循环
	int j(2);			// 记录原数组下标
	for (; i != list.getListSize(); ++i,++j)
	{
		if (list.find())
		{
			list.del();
			cout << "\n在位置" << j << "上删除数字字符成功。\n";
			j++;
		}
	}
	return true;
}


 

你可能感兴趣的:(算法,list,delete,Class,insert,destructor)