// 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;
}