数据结构模板之一:顺序表

①基本定义

线性表是具有相同特征的数据结构元素的一个有限序列。

顺序表即采用顺序存储结构的线性表,可以说是数据结构中最容易理解,也是最常用的存储方式。


②存储方式与结构

线性表(a1,a2,...,an-1,an)

↓(直接映射)

顺序表

a1 a2 ... an-1 an

所有元素按其逻辑顺序依次存储到从计算机存储器中某位置开始的一块连续的存储空间中。

所占用的存储空间大小为sizeof(数据类型) * n,n为线性表(或顺序表)的长度。


③实现

#include <stdio.h>
#include <stdlib.h>
#define MaxSize 50                                     //这里可以改变表的最大储存值
typedef int ElemType;                                  //和数据类型
typedef struct
{
	ElemType data[MaxSize];
	int length;
}SqList;                                                //顺序表类型SqList


/*****建立顺序表*****/
void CreateList(SqList * &L,ElemType a[],int n)         
{
	int i=0,k=0;                                        //k表示L中的元素个数,初始值为0
	L=(SqList *)malloc(sizeof(SqList));                 //分配存放线性表的空间
	while(i<n)                                          //i扫描数组a            (个人觉得此处条件有问题)
	{
		L->data[i]=a[i];                                //将元素a[i]存放到L中
		k++; i++;
	}
	L->length=k;                                        //设置L的长度为k
}


/*****初始化线性表*****/
void InitList(SqList * &L)                                         
{
	L=(SqList *)malloc(sizeof(SqList));                 //分配存放线性表的空间
	L->length=0;                                        //置空线性表的长度为0
}


/*****销毁线性表*****/
void DestroyList(SqList * &L)
{
	free(L);                                            //释放L所指的顺序表空间
}


/*****判断线性表是否为空表*****/
bool ListEmpty(SqList *L)
{
	return (L->length==0);
}


/*****求线性表的长度*****/
int ListLength(SqList *L)
{
	return (L->length);
}


/*****输出线性表*****/
void DispList(SqList *L)
{
	for(int i=0;i<L->length;i++)                           //扫描顺序表输出各元素值
		printf("%d",L->data[i]);
	printf("\n");
}


/*****求线性表中某个数据元素值*****/
bool GetElem(SqList *L,int i,ElemType &e)
{
	if(i<1 || i>L->length)
		return false;                                      //参数i错误时返回false
	e=L->data[i-1];                                        //取元素值
	return true;                                           //成功找到元素时返回true
}


/*****按元素值查找*****/
int LocateElem(SqList *L,ElemType e)
{
	int i=0;
	while(i<L->length && L->data[i]!=e)
		i++;                                                //查找元素e
	if(i>=L->length)
		return 0;
	else
		return i+1;                                         //找到后返回其逻辑序号
}


/*****插入数据元素*****/
bool ListInsert(SqList * &L,int i,ElemType e)
{
	int j;
	if(i<1 || i>L->length+1)
		return false;                                        //参数错误时返回false
	i--;                                                     //将顺序表逻辑符号转化为物理符号
	for(j=L->length;j>i;j--)                                 //将data[i]及后面的元素后移一个位置
		L->data[j]=L->data[j-1]; 
	L->data[i]=e;                                            //插入元素e
	L->length++;                                             //顺序表长度增1
	return true;                                             //成功插入返回true
}


/*****删除数据元素*****/
bool ListDelete(SqList * &L,int i,ElemType &e)
{
	int j;
	if(i<1 || i>L->length)                                   //参数i错误时返回false
		return false;
	i--;                                                     //将顺序表逻辑符号转化为物理符号
	e=L->data[i];
	for(j=i;j<L->length-1;j++)                               //将data[i]之后的元素前移一个位置
		L->data[j]=L->data[j]+1;
	L->length--;                                             //顺序表长度减一
	return true;                                             //成功删除返回true
}


int main()
{
	return 0;
}

值得一提的是,不需要死记模板,重要的是理解该存储结构,部分算法例如插入数据元素,删除数据元素应视具体情况自己编写算法。

---代码和部分内容参考自《数据结构教程》

猜你喜欢

转载自blog.csdn.net/gsdxiaohei/article/details/80790945