您的位置:首页 > 其它

线性表之顺序存储实现

2015-12-23 02:27 281 查看
#ifndef _SQ_LIST_H_
#define _SQ_LIST_H_
#pragma once

/************************************************************************/
/*                            线性表List									*/
/************************************************************************/

/*ADT 线性表(List)
Data
	线性表的数据对象集合为{a1,a2,....an},每个元素的类型为DataType。其中除了第一个元素a1外,
	其他数据元素都有且仅有一个后继元素,除了最后一个元素an外,其他数据元素都有且仅有一个前驱元素。
	数据元素之间的关系时一种一对一的关系。
Operation
	InitList(*L);初始化操作,建立一个空的线性表L。
	ListEmpty(L);若线性表为空,返回true,否则返回false
	ClearList(*L);将线性表清空
	GetElem(L,i,*e);将线性表中第i个位置元素值返回给e
	LocateElem(L,e);在线性表中查找与给定值e相等的元素,如果查找成功,返回该元素在线性表中的序号表示成功;否则返回-1表示失败
	ListInsert(*L,i,e);在线性表中的第i个位置插入元素e
	ListDelete(*L,i,*e);删除线性表中第i个位置的元素,并返回这个位置的元素值e
	ListLength(L);返回线性表L的元素个数
endADT
*/

/************************************************************************/
/*					线性表顺序存储实现SequenceList                                                                    */
/************************************************************************/

#define MaxCapacity 100
typedef int ElemType;
typedef struct 
{
	ElemType* data;
	int length;
	int capacity;
}SqList;

#define OK 1
#define ERROR 0
typedef int Status;

/**初始化操作,建立一个空的线性表L。*/
int InitList(SqList* L)
{
	L->data = (ElemType*)malloc(sizeof(ElemType)*MaxCapacity);
	if(NULL == L->data)
		return ERROR;

	L->capacity = MaxCapacity;
	L->length = 0 ;

	return OK;
}

/**若线性表为空,返回true,否则返回false*/
bool ListEmpty(SqList L)
{
	return L.length == 0;
}

/**将线性表清空*/
Status ClearList(SqList*L)
{
	free(L->data);
	L->data = NULL;

	L->length = 0;

	return OK;
}

/**将线性表中第i个位置元素值返回给e*/
Status GetElem(SqList L,int i,ElemType* e)
{
	if( i< 0
		||L.length == 0
		|| i >= L.length)
		return ERROR;

	*e = L.data[i];

	return OK;
}

/**在线性表中查找与给定值e相等的元素,如果查找成功,返回该元素在线性表中的序号表示成功;否则返回-1表示失败*/
int LocateElem(SqList L ,ElemType e)
{
	if(L.length == 0)
		return -1;

	for (int i = 0 ; i < L.length; i++)
	{
		if(L.data[i] == e)
			return i;
	}

	return -1;
}

/**在线性表中的第i个位置插入元素e*/
Status ListInsert(SqList*L,int i,ElemType e)
{
	if(L->length == MaxCapacity
		||i < 0
		||i > L->length)
		return ERROR;

	for (int j = L->length ; j>=i ; j--)
	{
		L->data[j+1] = L->data[j];
	}
	L->data[i] = e;
	L->length++;

	return OK;
}

/**删除线性表中第i个位置的元素,并返回这个位置的元素值e*/
Status ListDelete(SqList*L,int i,ElemType* e)
{
	if (L->length == 0
		|| i < 0
		||i >= L->length)
		return ERROR;

	*e = L->data[i];
	for (int k = i ; k<L->length ; k++)
	{
		L->data[k] = L->data[k+1];
	}
	L->length--;

	return OK;
}

/**返回线性表L的元素个数*/
int ListLength(SqList L)
{
	return L.length;
}

#endif //_SQ_LIST_H_
测试程序
#include "stdafx.h"#include "SqList.h"int _tmain(int argc, _TCHAR* argv[]){	SqList sqStruct;	SqList* L = &sqStruct;	Status result = InitList(L);	for (int i = 0 ; i < 10 ; i++)	{		ListInsert(L,i,i+1);	}	std::cout<<"线性表存储有"<<ListLength(*L)<<"个元素"<<std::endl;	ElemType deleteValue;	ListDelete(L,1,&deleteValue);	std::cout<<"删除第"<<1<<"个的元素值为:"<<deleteValue<<std::endl;	std::cout<<"线性表存储剩余有"<<ListLength(*L)<<"个元素"<<std::endl;	ElemType getValue;	GetElem(*L,4,&getValue);	std::cout<<"获取的第"<<4<<"个的元素值为:"<<getValue<<std::endl;	int position = LocateElem(*L,6);	std::cout<<"值为"<<6<<"的元素位置为:"<<position<<std::endl;	bool isEmpty = ListEmpty(*L);	std::string strEmpty = isEmpty ? "为空":"不为空";	std::cout<<"当前线性表"<<strEmpty.c_str()<<std::endl;	for(int i = 0 ; i < L->length; i++)	{		std::cout<<"当前线性表第"<<i<<"项元素的值为"<<L->data[i]<<std::endl;	}	result = ClearList(L);	std::cout<<"执行清空操作"<<std::endl;	return 0;}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: