分享一段线性表相关操作的程序,线性表的实现非常简单。这里设置了一个栅栏以便一些操作,可自建类型作为元素进行测试。实现的功能主要有:
①生成和清除线性表
②查找
③插入、添加
④删除
⑤当前节点找后继和前驱节点
⑥表长度增减
头文件:
// Alist.h
#define DefaultListSize 10 //const int DefaultListSize = 10;
/************************************************************
基于数组的线性表实现
功能:
生成和清除线性表
当前节点找后继和前驱元素
获取改变值
长度增减、任何位置插入删除
***************************************************************/
template <class Elem>
class AList
{
private:
int maxSize; // 线性表最大存放元素数
int listSize; // 线性表实际存放元素数
int fence; // 栅栏的位置
Elem* listArray; // 存放元素的数组(地址)
public:
AList(int size=DefaultListSize) // 该参数可选
{
maxSize = size;
listSize = fence = 0;
listArray = new Elem[maxSize];
}
~AList() { delete [] listArray; }
//清除线性表
void clear()
{
delete [] listArray;
listSize = fence = 0;
listArray = new Elem[maxSize];
}
//插入:插值在右边(栅栏分界)第一个元素
bool insert(const Elem&);
//添加:线性表末尾添加元素
bool append(const Elem&);
//删除:删除并得到栅栏右边第一个元素
bool remove(Elem&);
void setStart() { fence = 0; }
void setEnd() { fence = listSize; }
//后继和前驱元素
void prev() { if (fence != 0) fence--; }
void next() { if (fence <= listSize) fence++; }
//实际线性表中栅栏左侧和右侧元素数
int leftLength() const { return fence; }
int rightLength() const { return listSize - fence; }
//判断并设置栅栏位置
bool setPos(int pos)
{
if ((pos >= 0) && (pos <= listSize)) fence = pos;
return (pos >= 0) && (pos <= listSize);
}
//判断并获取栅栏处的值
bool getValue(Elem& it) const
{
if (rightLength() == 0)
return false;
else
{
it = listArray[fence];
return true;
}
}
void print() const
{
int temp = 0;
cout << "< ";
while (temp < fence) cout << listArray[temp++] << " ";
cout << "| ";
while (temp<listSize) cout << listArray[temp++] << " ";
cout << ">\n";
}
};
template <class Elem>
bool AList<Elem>::insert(const Elem& item)
{
if (listSize == maxSize) return false; //线性表满
for(int i=listSize; i>fence; i--) // 栅栏右边的元素向后移,腾出插入的空间
listArray[i] = listArray[i-1];
listArray[fence] = item;
listSize++; // 线性表大小+1
return true;
}
template <class Elem>
bool AList<Elem>::append(const Elem& item)
{
if (listSize == maxSize) return false; //线性表满
listArray[listSize++] = item;
return true;
}
template <class Elem> bool AList<Elem>::remove(Elem& it)
{
if (rightLength() == 0) return false; // 删除元素不存在
it = listArray[fence]; // 暂存删除元素
for(int i=fence; i<listSize-1; i++) // 栅栏右边的元素向前移
listArray[i] = listArray[i+1];
listSize--; // 线性表大小-1
return true;
}
实现部分:
// Alist.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include "Alist.h"
#include "time.h"
#include <iostream>
using namespace std;
//自定义断言功能,val假输出错误信息
void Assert(bool val, char* string) {
if (!val)
{
cout << "Assertion Failed: " << string << endl;
exit(-1);//不成功的终止
}
}
//判断奇偶
inline bool EVEN(int x) { return (x % 2) == 0; }
inline bool ODD(int x) { return (x & 1) != 0; }
//产生随机数
inline void Randomize()
{ srand(1); }
inline int Random(int n)
{ return rand() % (n); }
//交换两个元素
//数组
template<class Elem>
inline void swap(Elem A[], int i, int j) {
Elem temp = A[i];
A[i] = A[j];
A[j] = temp;
}
//引用
template<class Elem>
inline void swap(Elem &e1, Elem &e2) {
Elem temp = e1;
e1 = e2;
e2 = temp;
}
//计时
clock_t tstart = 0;
void Settime()//系统当前时间
{
tstart = clock();
}
double Gettime()//转换为以秒为单位的时间段
{
return (double)((double)clock() - (double)tstart)/(double)CLOCKS_PER_SEC;
}
//查找整型元素
bool find(AList<int>& L, int k)
{
int it;
for (L.setStart(); L.getValue(it); L.next())
if (k == it)
return true;
return false;
}
int _tmain(int argc, _TCHAR* argv[])
{
AList<int> L1(15);
int temp=0;
L1.setStart();
L1.append(int(39));
L1.next();
L1.append(int(9));
L1.append(int(5));
L1.append(int(4));
L1.append(int(2));
L1.append(int(1));
cout << "建线性表 ";
L1.print();
L1.insert(int(3));
cout << "插入元素 ";
L1.print();
L1.remove(temp);
cout << "删除元素 ";
L1.print();
L1.setStart();
if (! find(L1, 3))
cout << "查找元素:Value 3 not found.\n";
else cout << "查找元素:Found 3" << endl;
system("pause");
return 0;
}
运行结果: