/********************************************************************
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;
}