线性表——线性表的顺序存储结构的设计思路与实现

线性表简介:

线性表是一种基本的数据结构,它是由n个相同类型的数据元素组成的有序序列。线性表的每个数据元素称为元素或节点,每个元素可以有一个或多个数据项组成。线性表元素之间的关系是一对一的线性关系,即除了第一个元素和最后一个元素之外,每个元素都有唯一的前驱和后继。

线性表常见的操作包括:初始化表、销毁表、插入元素、删除元素、查找元素、判断表空、遍历表等。

本帖子主要介绍线性表的顺序存储结构,以下称为顺序表。

首先声明一些常用的数据类型的定义:

#define MAXSIZE 50

typedef int ElemType;

顺序表的定义:

typedef struct{
	ElemType data[MAXSIZE];
	int size;
}SqList;

顺序表的初始化:

仅需进行内存的分配即可,并将元素数量初始化为0,实现代码:

bool InitList(pSqList *L)
{
	(*L) = (SqList *)malloc(sizeof(SqList));		// 为顺序表分配内存 
	if((*L) == NULL)								// 判断是否分配内存成功 
	{
		printf("InitList: Error_malloc\n");
		return false;
	}
	(*L)->size = 0;								 // 初始化顺序表的长度 
	return true;
}

顺序表的创建:

创建的时候可以传递数组,来实现对于顺序表的创建,遍历传递的数组时,注意不要数组越界,实现代码:

void CreateList(pSqList *L, ElemType arr[])
{
	int i = 0;
	while(arr[i] != 0xFEFEFEFE)				// 判断是否需要结束遍历 
	{
		(*L)->data[i] = arr[i];
		++i;
	}
	(*L)->size = i;
	return; 
}

获取顺序表中元素的数量:

通过顺序表结构中的size成员来获取顺序表中的元素数量,实现代码:

int Size(pSqList *L)
{
	return (*L)->size;
}

判断顺序表是否为空:

在顺序表结构中,如果size成员的值是0,则说明顺序表中没有成员,则说明顺序表为空,实现代码:

bool Empty(pSqList *L)
{
	if((*L)->size == 0)
	    return true;
	return false;
}

获取顺序表中的第i个元素的值:

设计时,要注意第i个元素是否存在,不存在就返回false,存在就返回true,如果存在,需要返回数据元素,可以将一个变量作为缓冲,函数设置一个指针作为返回第i个元素的媒介。实现代码如下:

bool GetElem(pSqList *L, ElemType *e, int i)
{
	if(i > (*L)->size || i < 1)
	{
		e = NULL;
		return false;
	}
	*e = (*L)->data[i - 1];
	return true;
}

查找某个值是否存在:

查找值时,需要遍历顺序表的数据域,不存在就返回0或者是-1等非正值,存在就返回查找的值时第几个数据元素,或者是返回true等具有判断型的标志,根据需求修改即可。设计思路如下(以返回元素的位置为基础):

int SearchElem(pSqList *L, ElemType *e)
{
	int i;
	for(i = 0; i < (*L)->size; ++i)
	{
		if((*L)->data[i] == *e)
		{
			return (i + 1);
		}
	}
	return -1;
}

在一个指定位置插入一个元素

在插入时,需要进行位置的检测,位置不正确返回false,如果位置正确,则先进行是否满元素判断,如果元素已满,则返回false,表示插入失败,如果位置正确且有空位来进行存储,则先进行元素位置的移动,在将元素插入指定位置。实现代码:

bool Insert(pSqList *L, ElemType *e, int pos)
{
	if(pos < 1 || pos > MAXSIZE || (*L)->size == MAXSIZE)
	    return false;
	int i;
	for(i = (*L)->size; i > pos - 1; --i)
	{
		(*L)->data[i] = (*L)->data[i - 1];
	}
	(*L)->data[pos - 1] = *e;
	++(*L)->size;
	return true;
}

删除一个指定位置的元素:

首先对删除的位置进行位置检查,看是否存在越界,不存在越界,假设我们要删除第i个元素(i是一个合法的位置),我们可以直接将第i+1个位置的元素覆盖掉第i个位置的元素,依次将后边的元素前移一个即可。实现代码如下:

bool Delete(pSqList *L, int pos, ElemType *e)
{
	if(pos < 1 || pos > (*L)->size)
	    return false;
	int i;
	if(e != NULL)
	    *e = (*L)->data[pos - 1];
	for(i = pos - 1; i < (*L)->size; ++i)
	{
		(*L)->data[i] = (*L)->data[i + 1];
	}
	--(*L)->size;
	return true;
}

展示全部元素:

在打印所有元素时需要注意不要数组越界,实现代码如下:

void Display(pSqList *L)
{
	int i;
	for(i = 0; i < (*L)->size; ++i)
	{
		printf("%d ", (*L)->data[i]); 
	}
	return;
}

总代码如下:

#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <malloc.h>

#define MAXSIZE 50

typedef int ElemType;

typedef struct{
	ElemType data[MAXSIZE];
	int size;
}SqList, *pSqList;

void CreateList(pSqList *L, ElemType arr[])
{
	int i = 0;
	while(arr[i] != 0xFEFEFEFE)				// 判断是否需要结束遍历 
	{
		(*L)->data[i] = arr[i];
		++i;
	}
	(*L)->size = i;
	return; 
}

bool InitList(pSqList *L)
{
	(*L) = (SqList *)malloc(sizeof(SqList));		// 为顺序表分配内存 
	if((*L) == NULL)								// 判断是否分配内存成功 
	{
		printf("InitList: Error_malloc\n");
		return false;
	}
	(*L)->size = 0;								 // 初始化顺序表的长度 
	return true;
}

bool Empty(pSqList *L)
{
	if((*L)->size == 0)
	    return true;
	return false;
}

int Size(pSqList *L)
{
	return (*L)->size;
}

bool GetElem(pSqList *L, ElemType *e, int i)
{
	if(i > (*L)->size || i < 1)
	{
		e = NULL;
		return false;
	}
	*e = (*L)->data[i - 1];
	return true;
} 

int SearchElem(pSqList *L, ElemType *e)
{
	int i;
	for(i = 0; i < (*L)->size; ++i)
	{
		if((*L)->data[i] == *e)
		{
			return (i + 1);
		}
	}
	return -1;
}

bool Insert(pSqList *L, ElemType *e, int pos)
{
	if(pos < 1 || pos > MAXSIZE || (*L)->size == MAXSIZE)
	    return false;
	int i;
	for(i = (*L)->size; i > pos - 1; --i)
	{
		(*L)->data[i] = (*L)->data[i - 1];
	}
	(*L)->data[pos - 1] = *e;
	++(*L)->size;
	return true;
}

bool Delete(pSqList *L, int pos, ElemType *e)
{
	if(pos < 1 || pos > (*L)->size)
	    return false;
	int i;
	if(e != NULL)
	    *e = (*L)->data[pos - 1];
	for(i = pos - 1; i < (*L)->size; ++i)
	{
		(*L)->data[i] = (*L)->data[i + 1];
	}
	--(*L)->size;
	return true;
}

void Display(pSqList *L)
{
	int i;
	for(i = 0; i < (*L)->size; ++i)
	{
		printf("%d ", (*L)->data[i]); 
	}
	return;
}

int main()
{
	int arr[10];
	memset(arr, -2, sizeof(arr));		// 初始化数组 
	
	return 0;
}
请登录后发表评论

    没有回复内容