线性表顺序存储(C++ 实现)

这是一个使用C++实现的顺序存储线性表。它包括初始化、判断空表、清空表、查找元素、获取元素、插入元素和删除元素等操作。线性表采用数组存储,优点是可以快速存取任意位置元素,缺点是插入和删除需要移动大量元素并可能导致存储碎片。
摘要由CSDN通过智能技术生成
/********************************************************************
	created:	2014/12/18
	created:	18:12:2014   9:49
	filename: 	D:\visual studio 2012\Projects\List\List\list.h
	file path:	D:\visual studio 2012\Projects\List\List
	file base:	list
	file ext:	h
	author:		HanLuo
	
	purpose:	线性表

	优点:无需为表中的元素逻辑关系而增加额外的存储空间
		  可以快速存取表中的任一位置的元素

	缺点:插入和删除操作需要移动大量元素
		  容易造成存储空间的碎片
		  存储空间的容量,不好确定。
*********************************************************************/
#ifndef _LIST_H_
#define _LIST_H_

/************************************************************************/
/*	
采用数组存储
链表的第一个元素,数组【0】
	  第二个,	  数组【1】
	  第三个,	  数组【2】
	  ...
*/
/************************************************************************/
enum Status
{
	FALSE = 0,
	TRUE  = 1,
};

#define MAXSIZE 20
typedef int ElemType;

//typedef struct
//{
//	ElemType data[MAXSIZE];			// 数组存储数据元素
//	int length;						// 线性表当前长度
//}SqList;

class SqList
{
public:
	
	// 初始化操作 建立一个空的线性表
	Status InitList(SqList *List);

	// 判断线性表是不是为空,为空返回true,否则返回false
	Status ListEmpty(SqList List);

	// 清空线性表
	Status ClearList(SqList *List);

	// 在线性表中查找与给定值相等的元素
	int LocateElem(SqList List, ElemType val);

	// 返回线性表的元素个数
	int ListLength(SqList list);

	// 得到i位置的元素  时间复杂度为O(1)
	Status GetElem (SqList L, int i, ElemType *val);

	// 插入操作  时间复杂度为O(n)
	Status ListInsert( SqList *L, int i, ElemType val);

	// 删除操作  时间复杂度为O(n)
	Status ListDelete( SqList *L, int i, ElemType *type);

private:
	ElemType data[MAXSIZE];				// 线性表的容量	

	int length;							// 线性表当前长度
};
#endif
#include "list.h"

//
Status SqList::InitList(SqList *List)
{
	List->length = 0;
	return TRUE;
}

//
Status SqList::ListEmpty(SqList List)
{
	if(List.length == 0)
		return TRUE;
	else
		return FALSE;
}

//
Status SqList::ClearList(SqList *List)
{
	List->length = 0;
	return TRUE;
}

//
Status SqList::GetElem(SqList L, int i, ElemType *e)
{
	if(L.length == 0 || i<1 || i > L.length)
		return FALSE;

	*e = L.data[i - 1];
	return TRUE;
}

//
int SqList::ListLength(SqList list)
{
	return list.length;
}

//
/* 初始条件:顺序线性表L已存在 */
/* 操作结果:返回L中第1个与e满足关系的数据元素的位序。 */
/* 若这样的数据元素不存在,则返回值为0 */
int SqList::LocateElem(SqList list, ElemType val)
{
	int i;
	if( list.length == 0)
		return FALSE;
	
	for(int i = 0; i < list.length; i++)
	{
		if(list.data[i] == val)
			break;					// 找到元素 不再循环 
	}
	if(i >= list.length)
		return FALSE;

	return i+1;
}

//
Status SqList::ListInsert(SqList *List, int i, ElemType e)
{
	int k; 
	
	if( List->length == MAXSIZE)				// 顺序线性表已经满了
		return FALSE;

	if(i < 1 || i > List->length + 1)			// 当i不再范围内的时候
		return FALSE;

	// 先判断插入的数据不在表尾
	if( i <= List->length )
	{
		for( k = List->length; k >= i - 1; k--) // 将要插入位置后数据元素向后移动一位
			List->data[k+1] = List->data[k];
	}

	List->data[i - 1] = e;
	List->length++;

	return TRUE;
}

//
Status SqList::ListDelete(SqList *List, int i, ElemType* type)
{
	int k;
	
	if( List->length == 0)					// 如果表为空  返回错误
		return FALSE;

	if( i < 1 || i > List->length)			// 删除的位置不正确
		return FALSE;

	*type = List->data[i - 1];				// 链表的元素,放在数组  -1 的位置

	if( i < List->length )
	{
		for( k = i; k < List->length; k++)
		{
			List->data[k-1] = List->data[k]; 
		}
	}

	List->length--;

	return TRUE;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值