【C++线性表的基本操作】C++线性表的基本操作:
代码如下:
#include
#include
using namespace std;
typedef int Elem;
#defineLIST_INST_SIZE 8
class List
{
public:
List(int size);
//构造函数
~List();
//析构函数,销毁
void ClearList();
//清空
bool ListEmpty();
//判空
int ListLength();
//返回线性表的长度
bool GetElem(int i, Elem *e);
//得到指定位置的元素
int LocateElem(Elem *e);
//寻找第一个满足e的数据元素的位序
bool PriorElem(Elem *currentElem, Elem *preElem);
//求一个元素的前驱
bool NextElem(Elem *currentElem, Elem *nextElem);
//求一个元素的后继
void ListTraverse();
//线性表遍历
bool ListInsert(int i, Elem *e);
//在第i个位置插入元素
bool ListDelete(int i, Elem *e);
//删除第i个位置的元素
void ListScan();
//输入线性表元素
private:
int *m_pList;
//用这个指针指向一块内存,用来存储线性表
int m_iSize;
//分配的空间大小
int m_iLength;
//指线性表中真实长度
};
List::List(int size)
{
m_iSize = size;
m_pList = new int[m_iSize];
m_iLength = 0;
}
List::~List()
{
delete[]m_pList;
m_pList = NULL;
}
void List::ClearList()
{
m_iLength = 0;
}
bool List::ListEmpty()
{
if (m_iLength == 0)
{
return true;
}
else
return false;
//return m_iLength==0?true:false;
}
int List::ListLength()
{
return m_iLength;
}
bool List::GetElem(int i, Elem *e)
{
if (i < 0 || i >= m_iSize)
{
return false;
}
*e = m_pList[i];
return true;
}
int List::LocateElem(Elem *e)
{
int i;
for (i = 0;
i < m_iLength;
i++)
{
if (m_pList[i] == *e)
{
return i;
}
}
return -1;
}
bool List::PriorElem(Elem *currentElem, Elem *preElem)
{
int temp=LocateElem(currentElem);
if (temp > 0 && temp < m_iLength)
{
*preElem = m_pList[temp - 1];
return true;
}
else
return false;
}
bool List::NextElem(Elem *currentElem, Elem *nextElem)
{
int temp = LocateElem(currentElem);
if (temp >= 0 && temp < m_iLength - 1)
{
*nextElem = m_pList[temp + 1];
return true;
}
else
return false;
}
void List::ListTraverse()
{
for (int i = 0;
i < m_iLength;
i++)
{
cout << m_pList[i] << " ";
}
cout << endl;
}
bool List::ListInsert(int i, Elem *e)
{
if (i < 0 || i >m_iLength)//i等于m_iLength时,相当于在线性表结尾处插入元素,不会走下面的For循环
{
return false;
}
for (int k = m_iLength-1;
k >=i ;
k--)
{
m_pList[k+1] = m_pList[k];
//从线性表的最后一个元素往后移,若从i的位置往后移,会覆盖掉i+1位置的元素,所以一定要从最后一个元素往后移
}
m_pList[i] = *e;
m_iLength++;
return true;
}
bool List::ListDelete(int i, Elem *e)
{
if (i < 0 || i >= m_iLength)
{
return false;
}
*e = m_pList[i];
for (int k = i;
k < m_iLength-1;
k++)
{
m_pList[k] = m_pList[k + 1];
}
m_iLength--;
return true;
}
void List::ListScan()
{
cout << "please enter numbers:" << endl;
for (int i = 0;
i < LIST_INST_SIZE;
i++)
{
cin >> m_pList[i];
m_iLength++;
}
}
int main()
{
int e1=7;
int e2,e3,e4,e5;
List *list1 = new List(10);
//调用构造函数,用堆实例化对象,分配内存为10
list1->ListScan();
//调用输入函数
cout << "得到下标为3位置的元素:" << endl;
list1->GetElem(3, &e3);
cout << e3 << endl;
cout << "得到e3元素的前驱:" << endl;
list1->PriorElem(&e3, &e4);
cout << e4 << endl;
cout << "得到e3元素的后继:" << endl;
list1->NextElem(&e3, &e5);
cout << e5 << endl;
cout << "在下标为2处插入e1:" << endl;
list1->ListInsert(2,&e1);
//调用插入函数
list1->ListTraverse();
cout << "删除下标为6的元素:" << endl;
list1->ListDelete(6, &e2);
//调用删除函数
list1->ListTraverse();
cout << e2 << endl;
delete list1;
//调用析构函数
system("pause");
return 0;
}
结果截图:
文章图片