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

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(使用前将#替换为@)

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

  • 算法:双指针

    双指针 双指针是一种思想或一种技巧并不是特别具体的算法 具体就是用两个变量动态存储两个结点 来方便我们进行一些操作 通常用在线性的数据结构中 特别是链表类的题目 经常需要用到两个或多个指针配合来记忆链表上的节点 完成某些操作 常见的双指针方
  • 数据库多维迭代算法

    关键词 数据库 迭代 递归 多维 一 两种传统的数据库迭代结构算法 对于数据库的迭代结构 有两种传统的算法 递归算法和边界算法 比如对于下面图1的结构 图1 递归算法的数据结构如表1所示 节点id 节点值 父节点id 1 1111 2 3
  • 一文弄懂循环链表、双向链表、静态链表

    循环链表 双向链表 静态链表 三遍定律 理解了单链表本文的理解易如反掌 单链表请点击这里 理解了单链表本文的理解易如反掌 单链表请点击这里 理解了单链表本文的理解易如反掌 单链表请点击这里 1 循环链表 将单链表中终端结点的指针端由空指针改
  • PCL—低层次视觉—点云分割(RanSaC)

    点云分割 点云分割可谓点云处理的精髓 也是三维图像相对二维图像最大优势的体现 不过多插一句 自Niloy J Mitra教授的Global contrast based salient region detection出现 最优分割到底鹿死
  • findBug 错误修改指南

    FindBugs错误修改指南 1 EC UNRELATED TYPES Bug Call to equals comparing different types Pattern id EC UNRELATED TYPES type EC c
  • 链表和线性表的优缺点

    链表和线性表的优缺点 作为我们最先接触的两个数据结构 链表和线性表的优缺点都较为明显 并且二者互相补足 文章目录 链表和线性表的优缺点 线性表 线性表的组成 线性表的缺点 线性表的优点 链表 链表的组成 链表的优点 链表的缺点 总结 线性表
  • 逆波兰表达式求值(C语言实现)

    实验项目 从文本文件输入任意一个语法正确的 中缀 表达式 显示并保存该表达式 利用栈结构 把上述 中缀 表达式转换成后缀表达式 并显示栈的状态变化过程和所得到的后缀表达式 利用栈结构 对上述后缀表达式进行求值 并显示栈的状态变化过程和最终结
  • 常用的十种算法--马踏棋盘算法

    1 马踏棋盘算法介绍 马踏棋盘算法也被称为骑士周游问题 将马随机放在国际象棋的 8 8 棋盘 Board 0 7 0 7 的某个方格中 马按走棋规则 马走日字 进行移动 要求每个方格只进入一次 走遍棋盘上全部 64 个方格 2 马踏棋盘算法
  • DDP入门

    DDP 即动态动态规划 可以用于解决一类带修改的DP问题 我们从一个比较简单的东西入手 最大子段和 带修改的最大子段和其实是常规问题了 经典的解决方法是用线段树维护从左 右开始的最大子段和和区间最大子段和 然后进行合并 现在我们换一种方法来
  • 数据结构与算法学习总结(六)——字符串的模式匹配算法

    基本概念 字符串是一种特殊的线性表 即元素都是 字符 的线性表 字符是组成字符串的基本单位 字符的取值依赖于字符集 例如二进制的字符集为0 1 则取值只能为 0 1 再比如英语语言 则包括26个字母外加标点符号 例如 abcde 就是一个字
  • 如何根据链表节点数据大小对链表节点进行排序

    对链表排序有两种方法 1 比较了两个节点的大小后 对指针进行改变 从而交换节点的顺序 2 比较了两个节点的大小后 只交换数据域 而不改变指针 从而交换节点的顺序 第二种办法比较简单 本文主要对第二种方法进行讲解 链表节点排序算法 采用 冒泡
  • JavaScript系列——数组元素左右移动N位算法实现

    引言 在自己刚刚毕业不久的时候 去了一家公司面试 面试官现场考了我这道题 我记忆深刻 当时没有想到思路 毫无疑问被面试官当成菜鸟了 最近刚好在研究数组的各种算法实现 就想到这道题 可以拿来实现一下 纪念自己逝去的青春 需求 假设有这样一个数
  • Unique Binary Search Trees -- LeetCode

    原题链接 http oj leetcode com problems unique binary search trees 这道题要求可行的二叉查找树的数量 其实二叉查找树可以任意取根 只要满足中序遍历有序的要求就可以 从处理子问题的角度来
  • 用指针访问一维数组

    文章目录 顺序查找 数组方式实现 指针实现方式 对一位数组元素的访问有三种方式 指针变量的关系运算 引例 数组实现方式 主函数 指针实现方式 主函数 一维数组作为函数的参数 实际应用 顺序查找 要求用指针实现 在整数集合r中顺序查找与给定值
  • 数据结构与算法-列表(双向链表)设计及其排序算法

    0 概述 本文主要涵盖列表 双向链表 的设计及其排序算法的总结 列表是一种典型的动态存储结构 其中的数据 分散为一系列称作节点 node 的单位 节点之间通过指针相互索引和访问 为了引入新节点或删除原有节点 只需在局部调整少量相关节点之间的
  • Linux 内核中的 Device Mapper 机制

    Linux 内核中的 Device Mapper 机制 尹 洋 在读博士生 尹洋 中科院计算所国家高性能计算机工程技术研究中心的在读博士生 主要从事服务部署和存储资源管理以及Linux块设备一级的开发和研究工作 简介 本文结合具体代码对 L
  • 二叉树结构的建立与遍历

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

    目录 一 栈的基本结构及其接口 二 我的队列结构定义 三 我的队列创建及其初始化 四 我的队列入队 五 我的队列出队 六 我的队列取队头元素 七 我的队列判空 八 我的队列销毁 一 栈的基本结构及其接口 栈的结构定义 typedef int
  • Leetcode1094. 拼车

    Every day a Leetcode 题目来源 1094 拼车 解法1 差分数组 对于本题 设 a i 表示车行驶到位置 i 时车上的人数 我们需要判断是否所有 a i 都不超过 capacity trips i 相当于把 a 中下标从
  • 【数据结构】单链表的定义和操作

    目录 1 单链表的定义 2 单链表的创建和初始化 3 单链表的插入节点操作 4 单链表的删除节点操作 5 单链表的查找节点操作 6 单链表的更新节点操作 7 完整代码 嗨 我是 Filotimo 很高兴与大家相识 希望我的博客能对你有所帮助

随机推荐

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

    一 什么是进程 进程是操作系统对一个正在运行的程序的一种抽象 换言之 可以把进程看作程序的一次运行过程 同时 在操作系统内部 进程又是操作系统进行资源分配的基本单位 注意以上的运行出来的可执行程序 这些程序就是 进程 二 那么操作系统是如何
  • 中国移动:《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