算法与数据结构基础-线性表

线性表

具有相同数据类型的n个数据元素的有限序列
数据元素可以仅仅是数组,也可以是自定义数据类型

线性表可以分两类:

顺序表

地址连续,类似数组,拥有下标,插入和删除元素时需要移动数据元素。
前驱,后继:当前元素的前一个和后一个元素,有且仅有一个

class List
{
public:
	List(int size);	//创建线性表
	~List();		//析构清除指针
	void ClearList();	//清空线性表
	bool ListEmpty();	//判空
	int ListLength();	//表长度
	bool GetElem(int i, int *e);	//获取特定值元素
	int LocateElem(int *e); 		//定位元素
	bool PriorElem(int *currentElem, int *preElem); 	//前驱元素
	bool NextElem(int *currentElem, int *nextElem); 	//后继元素
	void ListTraverse(); 			//遍历
	bool ListInsert(int i, int *e);		//插入
	bool ListDelete(int i, int *e);		//删除
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(){		//C语言没有bool类型,大写的BOOL是人为的宏定义
	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, int *e){
	if (i < 0 || i >= m_iLength)
	{
		return false;
	}
	*e = m_pList[i];
	return true;
}

int List::LocateElem(int *e){
	for (int i = 0; i < m_iLength; i++){
		if (m_pList[i] == *e)
			return i;
	}
	return -1; 		//不存在
}

bool List::PriorElem(int *currentElem, int *preElem){
	int temp = LocateElem(currentElem);
	if (temp == -1)
		return false;
	else if(temp==0)//当前为第一个元素,无前驱
		return false;
	else{
		*preElem=m_pList[temp - 1];
		return true;
	}
}

bool List::NextElem(int *currentElem, int *nextElem){
	int temp = LocateElem(currentElem);
	if (temp == -1)
		return false;
	else if (temp == m_iLength-1)//当前为最后一个元素,无后继
		return false;
	else{
		*nextElem = m_pList[temp + 1];
		return true;
	}
}

void List::ListTraverse(){
	for (int i = 0; i < m_iLength; i++){
		cout<<m_pList[i]<<" ";
		//m_pList[i].printCoordinate();
	}
}

bool List::ListInsert(int i, int *e)
{
	if (i < 0 || i >m_iLength) 	//=的情况允许,视为插入最后一个元素
		return false;
	for (int k=m_iLength-1; k>=i; k--){		//依次向后赋值,从最后开始,避免覆盖
		m_pList[k + 1] = m_pList[k];
	}
	m_pList[i] = *e;
	m_iLength++;
	return true;
}

bool List::ListDelete(int i, int *e){
	if (i<0 || i>=m_iLength){ 	//无=情况,没有下一个元素
		return false;
	}
	*e = m_pList[i];
	for (int k = i + 1; k < m_iLength; k++){	//依次向前赋值,从最前开始
		m_pList[k - 1] = m_pList[k];
	}
	m_iLength--;
	return true;
}

链表

不需要地址连续的存储单元,通过链建立元素之间的逻辑关系,插入删除操作不需要移动数据元素。有单链表,循环链表,双向链表。

你可能感兴趣的:(笔记,数据结构,算法)