数据结构-----顺序表与单链表的实现

2023-11-09

1.顺序表


//
//  实现顺序表的初始化,插入,删除,查找,逆置,合并等操作
//

//

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

typedef  int        ElemType ;
#define  MAXSIZE    100
#define  INCREMENT  100

typedef struct SeqList
{
	ElemType * head ;  // 数据存储空间
	int length ; // 长度
	int size ;   // 最大容量
} SeqList ;

// 初始化
void InitSeqList( SeqList * S )
{
	S->head = (ElemType*)malloc(sizeof(ElemType)*MAXSIZE) ;
	if( S->head == NULL )
	{
		printf("线性表初始化时内存分配失败!\n") ;
		exit(0) ;
	}
	S->length = 0 ;
	S->size = MAXSIZE ;
}

// 查找
// 输入元素的值,返回元素的索引 ; 查找失败返回-1
int Find( SeqList * S , ElemType elem )
{
	int i = 0 ;
	for( ; i < S->length ; i++ )
	{
		if( S->head[i] == elem )
		{
			return i ;
		}
	}
	return -1 ;
}

// 插入
// 在某个索引前面插入某个元素的值
void Insert( SeqList * S , int pos , ElemType elem )
{
	if( S->length + 1 == S->size )   // 检查顺序表内存是否足够
	{
		ElemType * top = (ElemType*)realloc( S->head , MAXSIZE + INCREMENT ) ;
		if( !top )
		{
			printf("内存分配失败!\n") ;
			exit(0) ;
		}
		S->head = top ;
		S->size = S->length + INCREMENT ;
	}

	if( pos > S->length  || pos < 0 )  // 检查输入的索引是否合法
	{
		printf("输入的索引不合法!\n") ;
		exit(0) ;
	}

	int  i = S->length - 1 ;
	for( ; i >= pos ; i-- )
	{
		S->head[i+1] = S->head[i] ;
	}
	S->head[pos] = elem ;
	S->length ++ ;
}

//删除
//删除顺序表中的指定值的元素 
void Delete( SeqList * S , ElemType elem )
{
	int pos = Find( S , elem ) ;
	int i = 0 ;
	for( i = pos ; i < S->length ; i++ )
	{
		S->head[i] = S->head[i+1] ;
	}
	S->length -- ;
}

//交换
void Swap( ElemType * e1 , ElemType * e2 )
{
	ElemType tmp ;
	tmp = *e1 ;
	*e1 = *e2 ;
	*e2 = tmp ;
}

// 逆置
// 逆置线性表中的元素
void Reverse( SeqList * S )
{
	int i = 0 ;
	for( ; i < S->length / 2 ; i++ )
	{
		Swap( &S->head[i] , &S->head[S->length-1-i] ) ;
	}
}

// 递增排序
// 冒泡排序
void Sort( SeqList * S )
{
	int i = 0 ;
	int j = 0 ;
	for( ; i < S->length - 1 ; i++ )
	{
		for( j = i + 1 ; j < S->length ; j++ )
		{
			if( S->head[i] > S->head[j] )
			{
				Swap( &S->head[i] , &S->head[j] ) ;
			}
		}
	}
}


// 合并两个顺序表
// 保证合并后具有递增的顺序

void Union( SeqList * S1 , SeqList * S2 , SeqList * S3 )
{
	if( S3->size < S1->length + S2->length )
	{
		printf("顺序表过小,容纳不下合并之后的两个线性表!\n") ;
		exit(0) ;
	}

	Sort( S1 ) ;
	Sort( S2 ) ;

	int i = 0 ; 
	int j = 0 ;
	int k = 0 ;

	while( i < S1->length && j < S2->length )
	{
		if( S1->head[i] < S2->head[j] )
		{
			S3->head[k++] = S1->head[i++] ;
		}
	    else if( S1->head[i] > S2->head[j] )
		{
			S3->head[k++] = S2->head[j++] ;
		}
		else
		{
			S3->head[k++] = S1->head[i] ;
			S3->head[k++] = S2->head[j] ;
			i++ ;
			j++ ;
		}
	}

	if( i > S1->length - 1 )
	{
		while( j < S2->length )
		{
			S3->head[k++] = S2->head[i++] ;
		}
	}

	if( j > S2->length - 1 )
	{
		while( i < S1->length )
		{
			S3->head[k++] = S1->head[i++] ;
		}
	}
	S3->length = k ;
}

// 输出顺序表中的元素
void Print( SeqList * S )
{
	int i = 0 ; 
	for( ; i < S->length ; i++ )
	{
		printf("%d " , S->head[i] ) ;
	}
	printf("\n") ;
}

// 测试函数
int main()
{
	SeqList S1 , S2 , S3 ;

	InitSeqList( &S1 ) ;
	InitSeqList( &S2 ) ;
	InitSeqList( &S3 ) ;

	Insert( &S1 , 0 , 1 ) ;
	Insert( &S1 , 1 , 5 ) ;
	Insert( &S1 , 2 , 2 ) ;

	Insert( &S2 , 0 , 2 ) ;
	Insert( &S2 , 1 , 4 ) ;
	Insert( &S2 , 2 , 3 ) ;

	printf("S1:") ;
	Print( &S1 ) ;

	printf("S2:") ;
	Print( &S2 ) ;

	Union( &S1 , &S2 , &S3 ) ;

	printf( "S3:" ) ;
	Print( &S3 ) ;

	return 0 ;
}

2.链表

#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>

typedef int ElemType ;

typedef struct Node 
{
	ElemType elem ;
	struct Node * next ;
}Node ;

typedef struct LinkList
{
	Node *head ;  // 头结点
	int length ;  // 链表长度
} LinkList ;

void InitLinkList( LinkList * L )
{
	L->head = (Node*)malloc(sizeof(Node)) ;
	if( !L->head )
	{
		printf("内存申请失败!\n") ;
		exit(0) ;
	}

	L->head->next = NULL ;
	L->length = 0 ;
}

//判断 节点是否在链表中
bool Find( LinkList * L , Node node )
{
	Node * p = L->head ;

	while( ( p = p->next ) != NULL )
	{
		if( p->elem == node.elem )
		{
			return true ;
		}
	}
	return false ;
}

// 在表尾插入结点
void Insert( LinkList * L , ElemType elem ) 
{
	Node * node = (Node*)malloc(sizeof(Node)) ;
	if( !node )
	{
		printf("申请内存失败!\n") ;
		exit(0) ;
	}
	node->elem = elem ;
	node->next = NULL ;

	Node * p = L->head ;
	while( p->next != NULL )
	{
		p = p->next ;
	}
	p->next = node ;
	L->length++ ;
}

// 删除结点
bool Delete( LinkList * L , ElemType elem )
{
	Node * p = L->head ;
	Node * q = p ;

	while( p->next != NULL )
	{
		q = p ;
		p = p->next ;
		if( p->elem == elem )
		{
			q->next = p->next ;
			free( p ) ;
			L->length-- ;
			return true ;
		}
	}
	return false ;
}


void Print( LinkList * L )
{
	Node * p = L->head ;

	while( p->next != NULL )
	{
		p = p->next ;
		printf("%d " , p->elem ) ;
	}
	printf("\n") ;
}

int main()
{
	LinkList L ;
	InitLinkList( &L ) ;

	Insert( &L , 5 ) ;
	Insert( &L , 4 ) ;
	Insert( &L , 8 ) ;
	Insert( &L , 2 ) ;

	Print( &L ) ;

	Delete( &L , 8 ) ;

	Print( &L ) ;

	return 0 ;
}








本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构-----顺序表与单链表的实现 的相关文章

  • 以OpenGL/ES视角介绍gfx-hal(Vulkan) Shader/Program接口使用

    文档列表见 Rust 移动端跨平台复杂图形渲染项目开发系列总结 目录 背景 The right way to tackle this in Vulkan is to use resource descriptors A descriptor
  • Mysql 数据库

    数据库基础 1 什么是数据库 用来存储数据 数据库可在硬盘及内存中存储数据 数据库与文件存储数据的区别 数据库本质也是通过文件来存储数据 数据库的概念就是系统的管理存储数据的文件 数据库介绍 本质就是存储数据的C S架构的socket套接字
  • LeetCode83: 删除排序链表中的重复元素

    给定一个已排序的链表的头 head 删除所有重复的元素 使每个元素只出现一次 返回 已排序的链表 示例 1 输入 head 1 1 2 输出 1 2 示例 2 输入 head 1 1 2 3 3 输出 1 2 3 提示 链表中节点数目在范围
  • 直线检测方法—LSD论文翻译

    附原文链接 LSD a Line Segment Detector 摘 要 LSD是一个线段检测器 能够在线性时间内得到亚像素级精度的检测结果 它无需调试参数就可以适用于任何数字图像上 并且能够自我控制错误数量的检测 平均来说 一个图像中允
  • 白盒测试相关的一些知识

    在白盒测试中 可以使用各种测试方法进行测试 下面这篇文章 可能比较枯燥 如果不乐意读 可以先收藏 如果在你的工作中真遇到白盒测试的话 可以回过头再来看看 还是值得读一读 一般来说 白盒测试时要考虑以下5个问题 1 测试中尽量先用自动化工具来
  • 4399 C++笔试题

    1 写出一个函数 取到链表中倒数第二个节点 双链表 node getSec List mylist return mylist m tail gt m prev m prev为链表前指针 单链表 node getSec List mylis
  • (笔试前准备)字符串匹配算法总结

    我想说一句 我日 我讨厌KMP KMP虽然经典 但是理解起来极其复杂 好不容易理解好了 便起码来巨麻烦 老子就是今天图书馆在写了几个小时才勉强写了一个有bug的 效率不高的KMP 特别是计算next数组的部分 其实 比KMP算法速度快的算法
  • PCL—低层次视觉—点云分割(RanSaC)

    点云分割 点云分割可谓点云处理的精髓 也是三维图像相对二维图像最大优势的体现 不过多插一句 自Niloy J Mitra教授的Global contrast based salient region detection出现 最优分割到底鹿死
  • 链表和线性表的优缺点

    链表和线性表的优缺点 作为我们最先接触的两个数据结构 链表和线性表的优缺点都较为明显 并且二者互相补足 文章目录 链表和线性表的优缺点 线性表 线性表的组成 线性表的缺点 线性表的优点 链表 链表的组成 链表的优点 链表的缺点 总结 线性表
  • Hash映射理解

    先说数组 数组优点之一 能通过索引很快定位到值 hashmap 就是利用了数组这个优点 对比 线性映射 定义一个数组 数组的元素是结构体 结构体包括 一对键 值 伪代码表示 a 0 struct Bill 5 a 1 struct KK 6
  • 亚利桑那州立大学周纵苇:研习 U-Net ——现有的分割网络创新

    雷锋网AI研习社按 经典的 Encoder Decoder 结构在目标分割问题中展现出了举足轻重的作用 然而这样一个相对固定的框架使得模型在感受野大小和边界分割精度两方面很难达到兼顾 本次公开课 讲者以 U Net 为案例分析 总结现有的分
  • 算法系列15天速成——第八天 线性表【下】

    一 线性表的简单回顾 上一篇跟大家聊过 线性表 顺序存储 通过实验 大家也知道 如果我每次向 顺序表的头部插入元素 都会引起痉挛 效率比较低下 第二点我们用顺序存储时 容 易受到长度的限制 反之就会造成空间资源的浪费 二 链表 对于顺序表存
  • 以太坊系列之十五: 以太坊数据库

    以太坊数据库中都存了什么 以太坊使用的数据库是一个NOSQL数据库 是谷歌提供的开源数据leveldb 这里尝试通过分析以太坊数据库存储了什么来分析以太坊可能为我们提供哪些关于区块链的API 存储内容 NOSQL是一个key value数据
  • UE4命令行使用,解释

    命令行在外部 从命令行运行编辑项目 1 导航到您的 LauncherInstall VersionNumber Engine Binaries Win64 目录中 2 右键单击上 UE4Editor exe 的可执行文件 并选择创建快捷方式
  • 图 - Java实现无向带权图的邻接矩阵表示法

    图 Java实现无向带权图的邻接矩阵表示法 1 图 1 1 图的介绍 图 Graph 是一种复杂的非线性表结构 图中的元素我们就叫做顶点 vertex 图中的一个顶点可以与任意其他顶点建立连接关系 我们把这种建立的关系叫做边 edge 跟顶
  • 算法学习——贪心算法之币种统计

    算法描述 币种统计 单位给每一位员工发工资 精确到元 为了保证不临时换零钱 使得每个员工取款的张数最少 在取工资前统计所有员工所需要的各种票面的张数 约定票种为100 50 20 10 5 2 1元 并验证币种统计是否正确 算法思路 算法描
  • 机器学习算法GBDT的面试要点总结-上篇

    1 简介 gbdt全称梯度提升决策树 在传统机器学习算法里面是对真实分布拟合的最好的几种算法之一 在前几年深度学习还没有大行其道之前 gbdt在各种竞赛是大放异彩 原因大概有几个 一是效果确实挺不错 二是即可以用于分类也可以用于回归 三是可
  • Linux下进程退出的几种形式

    进程退出 Linux 下进程的退出分为正常退出和异常退出两种 1 正常退出 a 在main 函数中执行return b 调用exit 函数 c 调用 exit 函数 2 异常退出 a 调用about函数 b 进程收到某个信号 而该信号使程序
  • 二叉树结构的建立与遍历

    实验项目 1 编写建立二叉树的二叉链表存储结构 左右链表示 的程序 并以适当的形式显示和保存二叉树 2 完成二叉树的7种遍历操作 3 给定一个二叉树 编写算法完成下列应用 1 判断其是否为完全二叉树 2 求二叉树中任意两个结点的公共祖先 输
  • 【试题】排列组合

    在写一个远程的代码 如果本地有M个显示器 远程有N个显示器 M lt N 依据分辨率 显示器刷新频率等要求 需要对远程的N个显示器进行最佳分辨率修改 之后 需要从N个远程显示器中选择M个 跟本地显示器进行一对一的匹配 即从 A N M N

随机推荐

  • 进程调度的过程以及进程与线程的区别

    一 什么是进程 进程是操作系统对一个正在运行的程序的一种抽象 换言之 可以把进程看作程序的一次运行过程 同时 在操作系统内部 进程又是操作系统进行资源分配的基本单位 注意以上的运行出来的可执行程序 这些程序就是 进程 二 那么操作系统是如何
  • 中国移动:《2020年区块链+边缘计算白皮书》 PDF文字版

    中国移动 2020年区块链 边缘计算白皮书 PDF文字版 下载 访问密码 168168 中国移动5G联合创新中心与中兴通讯 区块链技术与数据安全工业和信息化部重点实验室 北京大学新一代信息技术研究院合作 共同发布了 区块链 边缘计算白皮书
  • 低版本Mac OS安装合适xcode的方法

    在虚拟机上安装完Mac OS10 14 在Apple Store上准备安装xcode时出现 xcode 不能安装在 Macintosh HD 上 因为需要 OS X V10 14 3 或更高版本 导致无法安装Xcode 如图 解决方法 不在
  • Oracle sql 判断某个字段不等于某个值

    看着很简单的一个问题 直接写sql select from user where userName 张三 但是运行一下 就会发现 如果userName有null值 那null值的记录也查不出来了 就是这么神奇 正确的sql select f
  • 手机已经开启调试模式还提示This adb server‘s $ADB_VENDOR_KEYS is not setTry ‘adb kill-server‘ if that seems wrong

    手机已经开启调试模式还提示This adb server s ADB VENDOR KEYS is not set Try adb kill server if that seems wrong Otherwise check for a
  • WPS进行分类汇总计算,并且提取统计结果的详细步骤

    1 首先选中要进行分类统计的数据 2 选择 数据 选项 3 然后找到 分类汇总 选项 再次弹出对话框 选择按照那一列进行分类汇总 并选择统计的计算方法 点击确定 5 默认统计结果都会在每一组的下一行 点击 隐藏明细数据 选项 即可仅显示统计
  • java软件工程师工作业绩_java软件工程师的工作描述怎么写

    展开全部 1 负责研发62616964757a686964616fe4b893e5b19e31333365656636公司应用软件的模块设计 开发和交付 2 负责编码 单元测试 3 按照功能组件的详细设计 4 对其他软件工程师的代码进行审核
  • 【网络】nmcli 网络管理工具

    目录 nmcli 命令 前提 重启网络服务 重启网卡 实例 nmcli输出说明 3种网络配置方法 nmcli的命令参数 Tips ethtool 命令 IP命令 添加网卡到配置文件 Linux系统怎么查看网卡的UUID nmcli 命令 原
  • 4:Git的树对象

    树对象 tree object 它能解决文件名保存的问题 就是树对象有自己的名字 也允许我们将多个文件组织到一起 Git 以一种类似于 UNIX 文件系统的方式存储内容 所有内容均以树对象和数据对象 git 对象 的形式存储 其中树对象对应
  • 本地Linux服务器安装宝塔面板,并内网穿透实现公网远程登录

    文章目录 前言 1 安装宝塔 2 安装cpolar内网穿透 3 远程访问宝塔 4 固定http地址 5 配置二级子域名 6 测试访问二级子域名 转载自cpolar极点云文章 Linux安装宝塔 并实现公网远程登录宝塔面板 内网穿透 前言 宝
  • 【软件测试学习笔记】黑盒测试方法及案例

    文章目录 一 黑盒测试基本概念 二 黑盒测试的主要目的 三 优缺点 优点 缺点 四 黑盒测试的策略 五 黑盒测试方法 等价类划分 分类 划分方法 原则 等价类划分案例 边界值分析法 原则 边界值分析法案例 因果图法 四种因果关系 五种约束
  • 05

    1 Harbor简介 Harbor是由VMWare公司开源的容器镜像仓库 实际上 Harbor是在Docker Registry上进行相应的企业级扩展 从而获得了更加广泛的应用 组件 功能 harbor adminserver 配置管理中心
  • CentOS7安装MySQL5.7.26

    安装MySQL 在CentOS中默认安装有MariaDB 这个是MySQL的分支 但为了需要 还是要在系统中安装MySQL 而且安装完成之后可以直接覆盖掉MariaDB 下载并安装MySQL官方的 Yum Repository root l
  • django添加数据库字段进行数据迁移

    1 修改view py里面的变量 2 在model py新增字段 3 打开terminal并将环境切到项目所在环境 切换方式为 4 执行命令 python manage py makemigrations backend python ma
  • Redis(主从复制、哨兵模式、集群)概述及部署

    目录 引言 壹 Redis主从复制 一 Redis的高可用 二 Redis持久化 1 Redis 提供两种方式进行持久化 2 RDB 持久化 三 Redis主从复制 1 Redis主从复制的概念 2 Redis主从复制 四 Redis主从复
  • Linux系统删除文件夹下所有文件

    这篇文章来为大家介绍一下如何在 Linux 系统下删除文件 当 Linux 系统使用时间过长以后 难免会产生一些垃圾文件 这些文件除了会占用磁盘空间之外还会降低系统的运行效率 所以长时间运行后我们需要及时的清理一下这些垃圾文件 rm 是一个
  • 基于Hadoop的云盘系统上传和下载效率优化及处理大量小文件的解决方法

    基于任何平台实现的云盘系统 面临的首要的技术问题就是客户端上传和下载效率优化问题 基于Hadoop实现的云盘系统 受到Hadoop文件读写机制的影响 采用Hadoop提供的API进行HDFS文件系统访问 文件读取时默认是顺序 逐block读
  • 第7章 指针 第6题

    题目 Julian历法是用年及这一年中的第几天来表示日期 设计一个函数将Julian历法表示的日期转换成月和日 如Mar8 注意闰年的问题 函数返回一个字符串 即转换后的月和日 如果参数有错 如天数为第370天 返回NULL 代码 incl
  • superset官方文档的安装和配置

    原文 https superset incubator apache org installation html 下载 git clone https github com apache incubator superset cd incu
  • 数据结构-----顺序表与单链表的实现

    1 顺序表 实现顺序表的初始化 插入 删除 查找 逆置 合并等操作 include