数据结构-顺序表程序分析

Posted 坏坏-5

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构-顺序表程序分析相关的知识,希望对你有一定的参考价值。


  • 参考书籍《数据结构 实用C语言》【第5版】-朱战力

主函数

int main(void)
{
	Seqlist mylist;     //定义顺序表
	int i, x;
	ListInitiate(&mylist);  //对顺序表进行初始化
	// 对顺序表进行赋值
	for (i = 0; i < 10; i++)
		ListInsert(&mylist, i, i+1);

	// 对顺序表中的元素进行遍历输出
	for(i = 0; i < ListLength(mylist); i++)
	{
		ListGet(mylist, i, &x);
		printf("%-2d ", x);
	}
	printf("\\n");
	// 删除顺序表中第5个位置的元素
	ListDelete(&mylist, 5, &x);
	// 对删除第5个元素后的顺序表进行遍历
	for(i = 0; i < ListLength(mylist); i++)
	{
		ListGet(mylist, i, &x);
		printf("%-2d ", x);
	}
	printf("\\n");

	return 0;
}

定义结构体

/*定义结构体Seqlist*/
typedef struct
{
	DataType list[MaxSize];   //定义数组元素类型及数组元素最大个数
	int size;                 //顺序表中当前存储数据元素个数
}Seqlist;
  • 顺序表的存储

在这里插入图片描述

初始化

/*顺序表的初始化*/
void ListInitiate(Seqlist * L)  //初始化顺序表L
{
	L->size = 0;               //定义初始化数据元素个数
}

顺序表的元素个数

/*顺序表当前数据元素个数*/
int ListLength(Seqlist L)
{
	return L.size;           //返回顺序表L的当前数据元素个数
}

插入元素

/*顺序表插入数据元素*/
int ListInsert(Seqlist * L, int i, DataType x)
// 在顺序表的第i(0<=i<=size)个位置插入数据元素的值x
// 插入成功返回1,插入失败返回0
{
	int j;
	// 判断顺序表是否已满
	if (L->size >= MaxSize)
	{
		printf("顺序表已满!无法插入!\\n");
		return 0;
	}
	// 判断插入的位置是否合法
	else if (i < 0 || i > L->size)
	{
		printf("参数i不合法!\\n");
		return 0;
	}
	// 插入元素
	else
	{
		// 将第j-1位置的元素移动到j的位置
		for(j = L->size; j > i; j--)
			L->list[j] = L->list[j-1];
		// 在第i个位置,插入元素x,并把顺序表当前存储的元素个数+1
		L->list[i] = x;
		L->size ++;

		return 1;
	}
}
  • 插入元素过程

在这里插入图片描述

删除元素

/*顺序表删除数据元素*/
int ListDelete(Seqlist * L, int i, DataType * x)
// 删除顺序表L中第i(0<=i<=size-1)个位置的元素,并保存到x中
// 删除成功返回1,删除失败返回0
{
	int j;
	// 判断顺序表是否已空
	if (L->size <= 0)
	{
		printf("顺序表已空!\\n");
		return 0;
	}
	// 判断删除的位置是否合法
	else if (i < 0 || i > L->size - 1)
	{
		printf("参数i不合法!\\n");
		return 0;
	}
	// 删除元素
	else
	{
		*x = L->list[i];   //将删除的元素保存至x中
		// 将删除元素的下一个元素向前移动
		for(j = i + 1; j <= L->size - 1; j++)
			L->list[j-1] = L->list[j];
		// 将顺序表中存放的元素个数-1
		L->size --;

		return 1;
	}
}
  • 删除元素过程

在这里插入图片描述

取出元素

/*取出数据元素*/
int ListGet(Seqlist L, int i, DataType * x)
{
	// 判断取出的位置是否合法
	if (i < 0 || i > L.size - 1)
	{
		printf("参数i不合法!\\n");
		return 0;
	}
	// 取出元素
	else
	{
		*x = L.list[i];
		return 1;
	}
}

完整程序

/*
	顺序表的操作
*/
# include <stdio.h>
# define MaxSize 100  //定义MaxSize为100

typedef int DataType;  //定义别名
/*定义结构体Seqlist*/
typedef struct
{
	DataType list[MaxSize];   //定义数组元素类型及数组元素最大个数
	int size;                 //顺序表中当前存储数据元素个数
}Seqlist;

/*顺序表的初始化*/
void ListInitiate(Seqlist * L)  //初始化顺序表L
{
	L->size = 0;               //定义初始化数据元素个数
}


/*顺序表当前数据元素个数*/
int ListLength(Seqlist L)
{
	return L.size;           //返回顺序表L的当前数据元素个数
}

/*顺序表插入数据元素*/
int ListInsert(Seqlist * L, int i, DataType x)
// 在顺序表的第i(0<=i<=size)个位置插入数据元素的值x
// 插入成功返回1,插入失败返回0
{
	int j;
	// 判断顺序表是否已满
	if (L->size >= MaxSize)
	{
		printf("顺序表已满!无法插入!\\n");
		return 0;
	}
	// 判断插入的位置是否合法
	else if (i < 0 || i > L->size)
	{
		printf("参数i不合法!\\n");
		return 0;
	}
	// 插入元素
	else
	{
		// 将第j-1位置的元素移动到j的位置
		for(j = L->size; j > i; j--)
			L->list[j] = L->list[j-1];
		// 在第i个位置,插入元素x,并把顺序表当前存储的元素个数+1
		L->list[i] = x;
		L->size ++;

		return 1;
	}
}

/*顺序表删除数据元素*/
int ListDelete(Seqlist * L, int i, DataType * x)
// 删除顺序表L中第i(0<=i<=size-1)个位置的元素,并保存到x中
// 删除成功返回1,删除失败返回0
{
	int j;
	// 判断顺序表是否已空
	if (L->size <= 0)
	{
		printf("顺序表已空!\\n");
		return 0;
	}
	// 判断删除的位置是否合法
	else if (i < 0 || i > L->size - 1)
	{
		printf("参数i不合法!\\n");
		return 0;
	}
	// 删除元素
	else
	{
		*x = L->list[i];   //将删除的元素保存至x中
		// 将删除元素的下一个元素向前移动
		for(j = i + 1; j <= L->size - 1; j++)
			L->list[j-1] = L->list[j];
		// 将顺序表中存放的元素个数-1
		L->size --;

		return 1;
	}
}

/*取出数据元素*/
int ListGet(Seqlist L, int i, DataType * x)
{
	// 判断取出的位置是否合法
	if (i < 0 || i > L.size - 1)
	{
		printf("参数i不合法!\\n");
		return 0;
	}
	// 取出元素
	else
	{
		*x = L.list[i];
		return 1;
	}
}

int main(void)
{
	Seqlist mylist;     //定义顺序表
	int i, x;
	ListInitiate(&mylist);  //对顺序表进行初始化
	// 对顺序表进行赋值
	for (i = 0; i < 10; i++)
		ListInsert(&mylist, i, i+1);

	// 对顺序表中的元素进行遍历输出
	for(i = 0; i < ListLength(mylist); i++)
	{
		ListGet(mylist, i, &x);
		printf("%-2d ", x);
	}
	printf("\\n");
	// 删除顺序表中第5个位置的元素
	ListDelete(&mylist, 5, &x);
	// 对删除第5个元素后的顺序表进行遍历
	for(i = 0; i < ListLength(mylist); i++)
	{
		ListGet(mylist, i, &x);
		printf("%-2d ", x);
	}
	printf("\\n");

	return 0;
}
/*运行结果*/
-------------------------------
1  2  3  4  5  6  7  8  9  10
1  2  3  4  5  7  8  9  10
Press any key to continue . . .
-------------------------------

以上内容均属原创,如有不详或错误,敬请指出。

以上是关于数据结构-顺序表程序分析的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Firebase 分析跟踪 android 片段

顺序表超详细解析 | 从零开始一步步解读 | 画图理解+调试分析 | 早起狂肝两万字数据结构

顺序表分析

顺序表分析

顺序表分析

数据结构-线性表(顺序表与链表的基本知识 以及ArrayList 源码分析)