数据结构——线性表之顺序表

线性表的抽象出具类型定义:


动态存储分配的顺序表的定义:

<span style="font-size:14px;">typedef int ElemType;		//类型重定义

typedef struct
{
	ElemType *elem;			//顺序表元素
	int length;				//顺序表长度
	int listsize;			//当前分配数组容量
	int increamentsize;		//增补空间量(以ElemType为单位)
}SqList;</span>

逐个实现顺序表的各个操作

list.h

#ifndef __LIST_H__
#define __LIST_H__

#define LIST_INIT_SIZE 100  //顺序表的初始分配最大容量
#define LISTINCREAMENT 10	//(默认)增补空间量

typedef int ElemType;		//类型重定义

typedef struct
{
	ElemType *elem;			//顺序表元素
	int length;				//顺序表长度
	int listsize;			//当前分配数组容量
	int increamentsize;		//增补空间量(以ElemType为单位)
}SqList;					//动态顺序表


//初始化线性表
void InitList_Sq(SqList &L,int maxsize = LIST_INIT_SIZE,int incresize = LISTINCREAMENT);
//计算线性表长度
int  ListLengh_Sq(SqList L);
//查找元素e的位置
int  LocateElem_Sq(SqList L,ElemType e);
//插入元素
bool ListInsert_Sq(SqList &L,int i,ElemType e);
//删除元素
bool ListDelete_Sq(SqList &L,int i,ElemType &e);
//遍历元素
void ListTraverse_Sq(SqList L);
//获取元素
bool GetElem_Sq(SqList L,int i,ElemType &e);

#endif
linst.cpp

#include "list.h"
#include "string.h"							//memset所在库
#include "stdlib.h" 
#include "iostream"
#include "iomanip"
using namespace std;

void InitList_Sq(SqList &L,int maxsize,int incresize)
{
	L.elem = new ElemType[maxsize];			//分配制定大小的空间
	if (!L.elem)
	{
		exit(1);							//分配失败则退出
	}
	L.length = 0;							//线性表初始长度为0
	L.listsize = maxsize;					//线性表可用最大长度
	L.increamentsize = incresize;			//线性表可增加长度
}


int  ListLengh_Sq(SqList L)					
{
	return L.length;						//返回线性表的长度
}


//查找线性表中值为e的元素位置
int  LocateElem_Sq(SqList L,ElemType e)		
{
	for (int i = 0;i<L.length;i++)			//从线性表的表头至最大长度查找
	{
		if (L.elem[i] == e)					
		{
			return i;						//若找到则返回改元素位置
		}
	}
	return -1;								//未找到该元素,则返回-1
}


//向线性表插入元素
bool ListInsert_Sq(SqList &L,int i,ElemType e)
{
	int j;
	if (i < 0 || i > L.length)				//插入位置非法则退出
	{
		return false;
	}
	
	if (L.length > L.listsize)				//若线性表的长度大于线性表可用总容量
	{
		//扩大elem指针的可用范围,增加线性表长度
		L.elem = (ElemType*)realloc(L.elem,(L.listsize + L.increamentsize) * sizeof(ElemType));
		if (!L.elem)	//若分配失败,则退出
		{
			exit(1);
		}
		L.listsize += L.increamentsize;		//更新表长
	}
	for (j = L.length;j > i;j++)			//插入元素及以后元素向表后移动
	{
		L.elem[j] = L.elem[j-1];
	}
	L.elem[i] = e;							//插入元素
	L.length++;								//表长加1
	return true;
}


bool ListDelete_Sq(SqList &L,int i,ElemType &e)
{
	int j;
	if (i < 0 || i >= L.length)				//若删除位置非法,退出
	{
		return false;
	}
	if (L.length <= 0)						//线性表为空,退出
	{
		return false;
	}
	e = L.elem[i];							//待删除值转存
	for (j = i + 1;j <= L.length - 1;j++)	
	{
		L.elem[j-1] = L.elem[j];			//删除元素以后的元素逐个向前移动
	}
	L.length--;								//线性表长度减1
	return true;
}


void ListTraverse_Sq(SqList L)
{
	int i;
	for (i = 0;i < L.length;i ++)			//从线性表表头至表尾依次输出元素
	{
		cout<<setw(5)<<L.elem[i];
	}
	cout<<endl;
}

//获取位置为i的线性表中元素
bool GetElem_Sq(SqList L,int i,ElemType &e)
{
	if (i<0 || L.length)					//给定位置非法,退出
	{
		return false;
	}
	if (L.length <= 0)						//线性表为空,退出
	{
		return false;
	}
	e = L.elem[i];							//获取位置为i的元素
	return true;
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值