IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【数据结构与算法】程序内功篇二--线性顺序表 -> 正文阅读

[数据结构与算法]【数据结构与算法】程序内功篇二--线性顺序表


一、线性表顺序存储

1、顺序存储结构的表示

若将线性表L=(a0,a1, ……,an-1)中的各元素依次存储于计算机一片连续的存储空间。

例如:

设Loc(ai)为ai的地址,Loc(a0)=b,
每个元素占d个单元 则:Loc(ai)=b+i*d

在这里插入图片描述


2、顺序存储结构的特点

  • 逻辑上相邻的元素 ai, ai+1,其存储位置也是相邻的
  • 对数据元素ai的存取为随机存取或按地址存取
  • 存储密度高

存储密度D=(数据结构中元素所占存储空间)/(整个数据结构所占空间)


3、顺序存储结构的表示

在C语言中,可借助于一维数组类型来描述线性表的顺序存储结构
如下:

#define  N 100        //宏定义储存数,方便调整
typedef   int  data_t; //重定义数据类型,方便数据转换
typedef  struct                     
{   data_t data[N]//表的存储空间
     int last;   //最后一位数据的位置
}   sqlist, *sqlink;

二、线性表的C程序实现

1、线性表的基本运算

(1)建立一个空表:list_create(L)

/**
 * @description: 顺序表创建 
 * @param {无}
 * @return {sqlink-成功返回顺序表的地址,NULL-失败返回}
 */
sqlink sqlist_creat()
{
	sqlink sq = (sqlist *)malloc(sizeof(sqlist));
	if(sq == NULL)
	{
		#if DEBUG
		printf("sqlist creat erorr!\n");
		#endif
		return NULL;
	}

	memset(sq,0,sizeof(sqlist));
	sq->list = -1;

	return sq;
}

(2)删除一个顺序表:list_delete(L)

/**
 * @description: 顺序表删除
 * @param {sqlink-传递顺序表的地址} 
 * @return {1-函数成功,0-函数失败}
 */
int sqlist_delete(sqlink sq)
{
	if(sq == NULL)
	{
		#if DEBUG
		printf("sqlist has been delete or sqlist isn't exist!\n");
		#endif
		return 0;
	}

	free(sq);
	sq = NULL;

	return 1;
}

(3)置空表:list_clear(L)

/**
 * @description: 顺序表清空
 * @param {sqlink-传递顺序表的地址} 
 * @return {1-函数成功,0-函数失败}
 */
int sqlist_clear(sqlink sq)
{
	if(sq == NULL)
	{
		#if DEBUG
		printf("sqlist isn't exist!\n");
		#endif
		return 0;
	}

	if(sq->list == -1)
	{
		#if DEBUG
		printf("The sqlist has been clear!\n");
		#endif
		return 0;
	}
	else
	{
		memset(sq,0,sizeof(sqlist));
		sq->list = -1;
		return 1;
	}
}

(4)判断表是否为空:list_empty (L)

/**
 * @description: 查看顺序表是否为空
 * @param {sqlink-传递顺序表的地址} 
 * @return {1-表为空,-1,表不空,0-函数失败}
 */
int sqlist_empty(sqlink sq)
{
	
	if(sq == NULL)
	{
		#if DEBUG
		printf("sqlist isn't exist!\n");
		#endif
		return 0;
	}

	if(sq->list == -1)
		return 1;
	else
		return -1;
}

(5)求表长:length (L)

/**
 * @description:求顺序表长度 
 * @param {sqlink-传递顺序表的地址} 
 * @return {储存数据的长度,0-函数失败}
 */
int sqlist_length(sqlink sq)
{	
	if(sq == NULL)
	{
		#if DEBUG
		printf("sqlist isn't exist!\n");
		#endif
		return 0;
	}

	return sq->list+1;
}

(6)定位运算:Locate(L,x),确定元素x在表L中的位置(或序号)

/**
 * @description: 顺序表元素查找
 * @param {sqlink-传递顺序表的地址} 
 * @param {unsigned int-查找元素的位置} 
 * @return {i位置的元素,0-函数失败}
 */
int sqlist_element_query(sqlink sq,unsigned int i)
{	
	if(sq == NULL)
	{
		#if DEBUG
		printf("sqlist isn't exist!\n");
		#endif
		return 0;
	}
	if(i > sq->list)
	{	
		#if DEBUG
		printf("i too big\n");
		#endif
		return 0;
	}
	
	return sq->data[i];
}

(7)遍历列表:ergodic(L,x),确定元素x在表L中的位置(或序号)

/**
 * @description: 顺序表遍历所有元素
 * @param {sqlink-传递顺序表的地址} 
 * @return {1-函数成功,0-函数失败}
 */
int sqlist_ergodic(sqlink sq)
{	
	int i;
	if(sq == NULL)
	{
		#if DEBUG
		printf("sqlist isn't exist!\n");
		#endif
		return 0;
	}
	if(sq->list == -1)
	{
		#if DEBUG
		printf("sqlist is empty!\n");
		#endif
		return 0;
	}
	for(i = 0; i < sq->list+1; i++)
		printf("%d ", sq->data[i]);
	puts("");

	return 1;
}

2、基本运算的相关算法

(1)插入:Insert(L,x,i)

将元素x插入到表L中第i个元素ai之前,且表长+1
插入前: (a0,a1,---,ai-1,ai,ai+1-------,an-1) 0≤i≤n,i=n时,x插入表尾
插入后: (a0,a1,---,ai-1, x, ai,ai+1-------,an-1)

算法思路

若表存在空闲空间,且参数i满足:0≤i≤L->last+1,则可进行正常插入。
插入前,将表中(L->data[L->last]~L->data[i])部分顺序下移一个位置
然后将x插入L->data[i]处即可。算法对应的表结构。

在这里插入图片描述

C程序实现

/**
 * @description: 顺序表插入数据
 * @param {sqlink-传递顺序表的地址}
 * @param {unsigned int-插入数据的位置} 
 * @param {data_t-插入的数据} 
 * @return {1-函数成功,0-函数失败}
 */
int sqlist_insert(sqlink sq, unsigned int i, data_t x)
{	
	int n;

	if(sq == NULL)
	{
		#if DEBUG
		printf("sqlist isn't exist!\n");
		#endif
		return 0;
	}
	if(sq->list == N-1)
	{
		#if DEBUG
		printf("sqlist already full!\n");
		#endif
		return 0;
	}
	if(i > sq->list+1)
	{
		#if DEBUG
		printf("i is too big!\n");
		#endif
		return 0;
	}

	for(n = sq->list; i < n+1; n--)
		sq->data[n+1] = sq->data[n];
	sq->data[i] = x;
	sq->list++;

	return 1;
}

(2)删除:DeleteSqlist(L, i)

将表中第i个元素ai从表中删除。

算法思路

若参数i满足:0≤i≤L->last,
将表中L->data[i+1]∽L->data[L->last] 部分顺序向上移动一个位置,
覆盖L->data[i]。

在这里插入图片描述
C程序实现

/**
 * @description: 删除中元素
 * @param {sqlink-传递顺序表的地址} 
 * @param {unsigned int-删除数据的位置} 
 * @return {1-函数成功,0-函数失败}
 */
int sqlist_element_delete(sqlink sq, unsigned int i)
{	
	if(sq == NULL)
	{
		#if DEBUG
		printf("sqlist isn't exist!\n");
		#endif
		return 0;
	}
	if(i > sq->list)
	{
		#if DEBUG
		printf("i is too big!\n");
		#endif
		return 0;
	}
	
	for(; i < sq->list; i++)
		sq->data[i] = sq->data[i+1];
	sq->data[sq->list] = 0;
	sq->list--;

	return 1;
}

(3)设线性表La=(a0a1, ……,am-1), Lb= (b0b1, ……,bn-1),求La与Lb的并集并用La表示

在这里插入图片描述
算法思路

依次取表Lb中的bi(i=0,1,……,n-1),
若bi不属于La,则将其插入表La中。

C程序实现

/**
 * @description: 两个顺序表求并集
 * @param {sqlink-传递顺序表1的地址} 
 * @param {sqlink-传递顺序表2的地址} 
 * @return {1-函数成功,0-函数失败}
 */
int sqlist_union(sqlink sq1, sqlink sq2)
{	
	int i,j;

	if(sq1 == NULL || sq2 == NULL)
	{
		#if DEBUG
		printf("sqlist isn't exist!\n");
		#endif
		return 0;
	}
	if(sq2->list == -1)
	{
		#if DEBUG
		printf("sqlist2 is empty!\n");
		#endif
		return 0;
	}

	for(i = 0; i < sq2->list+1; i++)
	{
		if(sq1->list == -1)
		{
			sq1->data[0] = sq2->data[i];
			sq1->list++;
		}
		for(j = 0; j < sq1->list+1; j++)
		{
			if(sq1->data[j] == sq2->data[i])
				break;	
		}
		if(j > sq1->list)
			sqlist_insert(sq1,sq1->list+1, sq2->data[i]);		
	}
	return 1;
}

(4)设计清除线性表L=(a0,a1,—,ai,-------,an-1)中重复元素的算法

算法思路

对当前表L中的每个ai(0≤i≤n-2),依次与aj(i+1≤j≤n-1) 比较,
若与ai相等,则删除之。

C程序实现

/**
 * @description: 顺序表删除重复元素
 * @param {sqlink-传递顺序表的地址} 
 * @return {1-函数成功,0-函数失败}
 */
int sqlist_repeat_delete(sqlink sq)
{
	int i,j;

	if(sq == NULL)
	{
		#if DEBUG
		printf("sqlist isn't exist!\n");
		#endif
		return 0;
	}
	if(sq->list == -1)
	{	
		#if DEBUG
		printf("sqlist is empty!\n");
		#endif
		return 0;
	}

	for(i = 1; i < sqlist_length(sq)+1; i++)
		for(j = 0; j < i; j++)
		{
			if(sq->data[i] == sq->data[j])
				sqlist_element_delete(sq, j);	
		}
	return 1;
}

最后这里给出整体文件的免费下载链接:
顺序表C程序
到这里就结束啦!
在这里插入图片描述

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-10 22:50:47  更:2022-03-10 22:52:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 13:54:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码