您的位置:首页 > 编程语言 > C语言/C++

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

2015-01-05 13:46 501 查看
/********************************************************************
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 线性表 数据 链表