C语言实现顺序表

2023-11-18

线性表是数据结构中的逻辑结构。线性表采用顺序存储的方式存储就称之为顺序表,数组是顺序表在实际编程中的具体实现方式之一,本篇主要介绍顺序表,顺序表的创建、添加元素、删除元素、遍历输出等操作。​​​​​​​

1、创建顺序表

1.1定义顺序表结构体

结构体包含三个成员arr_base、cap、len。arr_base定义顺序表第一个元素的地址。Cap:定义顺序表可容纳元素的个数。Len:定义顺序表有效元素的个数。

typedef struct
{
	int *arr_base; //定义顺序表的第一个元素的地址 
	int cap; //定义顺序表可容纳元素的个数 
	int len; //定义顺序表有效元素的个数	
}Array,*PArray;

1.2 顺序表初始化函数

该函数需要输入最大容纳元素个数,初始化线性表指针、为顺序表数据段申请内存空间,定义结构体成员初始值,返回创建好线性表指针。

PArray Array_Init(int cap)
{
	PArray parr = (PArray)malloc(sizeof(Array));
	if(NULL == parr)
	{
		return NULL;
	}
	parr->arr_base = (int*)malloc(cap * sizeof(int));
	if(NULL == parr->arr_base)	
	{
		return NULL;
	}
	parr->cap = cap;
	parr->len = 0;
	return parr;
}

​​​​​​​

2、顺序表添加元素

2.1 顺序表追加元素

追加是在顺序表的最后添加元素,追加函数需要两个输入参数,线性表的指针(parr)和数据(data),主要完成两个功能,首先判断顺序表是否已满,如果没有满则添加元素,有效元素个数加1。

int Array_Append(PArray parr,int data)//最后添加元素 
{
	if(parr->len >= parr->cap)
	{
		return 0;
	}
	parr->arr_base[parr->len] = data;
	parr->len++;
	return 1;	
}

2.2 顺序表插入元素

插入元素需要三个输入参数,线性表指针(parr)、插入的位置(pos)、数据(data),其中pos的范围为0<=pos<len。插入算法说明:

顺序表原始元素为 1,2,3此时len = 3,假设插入的位置pos = 0,data = 5;

首先将len (3)位置的元素替换为len-1(2)位置的元素:1,2,3,3

将len-1 (2)位置的元素替换为len-2(1)位置的元素:1,2,2,3

将len-2 (1)位置的元素替换为len-3(0)位置的元素:1,1,2,3

将pos位置的元素替换为data:5,1,2,3

最后有效元素个数加1。

int Array_Insert(PArray parr,int pos,int data)//pos范围是0到parr->len - 1 
{
	int i = 0;
	if((pos < 0) || ((pos > parr->len - 1) && (parr->len > 0)) || (parr ->len == parr->cap))
	{	
		return 0;	
	}
	for(i = parr->len - 1;i >= pos;i--)
	{
		parr->arr_base[i + 1] = parr->arr_base[i];
	}
	parr->arr_base[pos] = data;
	parr->len++;
	return 1;	
}

4、顺序表删除元素

删除元素需要两个输入参数,线性表指针(parr)、数据(data),首先根据数据查找数据的索引位置,最后根据索引位置删除元素。

4.1 查找数据返回元素所在的索引

循环遍历索引数据,如果查找到返回数据元素的索引值,如果没有查找返回-1,如果顺序表中有多个相同的数据,返回第一次找到数据元素的索引值。

int Array_Find(PArray parr,int data)//查找元素 
{
	int i = -1;
	for(i = 0;i < parr->len;i++)
	{
		if(data == parr->arr_base[i])
		{
			break;
		}
	}
	if(i == parr->len)
	{
		return -1;
	}
	return i;
}

4.2 删除元素

删除算法说明:

顺序表原始元素为 1,2,3此时len = 3,假设要删除的data = 1;

首先查找data返回元素所在的索引pos(0)

将pos (0)位置的元素替换为pos+1(1)位置的元素:2,2,3

将pos+1 (1)位置的元素替换为pos+2(2)位置的元素:2,3,3

最后有效元素个数减1:2,3

int Array_Delete(PArray parr,int data)
{
	int i = 0;
	int pos = Array_Find(parr,data);
	if(pos < 0)
	{
		return 0;
	} 
	if((pos < 0) || (pos > parr->len - 1) || (parr ->len == parr->cap))
	{
		return 0;	
	}
	for(i = pos;i < parr->len - 1;i++)  
	{
		parr->arr_base[i] = parr->arr_base[i + 1];
	}
	parr->len--;
	return 1;	
}

5、顺序表遍历输出

需要传入线性表的指针parr,从索引0开始一直到len-1,循环输出所有元素。

void Array_Print(PArray parr)
{
	int i = 0;
	for(;i < parr->len;i++)
	{
		printf("%d ",parr->arr_base[i]);
	}
	printf("\n");
}

6、全部代码

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

typedef struct
{
	int *arr_base; //定义顺序表的第一个元素的地址 
	int cap; //定义顺序表可容纳元素的个数 
	int len; //定义顺序表有效元素的个数	
}Array,*PArray;

PArray Array_Init(int cap)
{
	PArray parr = (PArray)malloc(sizeof(Array));
	if(NULL == parr)
	{
		return NULL;
	}
	parr->arr_base = (int*)malloc(cap * sizeof(int));
	if(NULL == parr->arr_base)	
	{
		return NULL;
	}
	parr->cap = cap;
	parr->len = 0;
	return parr;
}

void Array_Print(PArray parr)
{
	int i = 0;
	for(;i < parr->len;i++)
	{
		printf("%d ",parr->arr_base[i]);
	}
	printf("\n");
}

int Array_Append(PArray parr,int data)//最后添加元素 
{
	if(parr->len >= parr->cap)
	{
		return 0;
	}
	parr->arr_base[parr->len] = data;
	parr->len++;
	return 1;	
}

int Array_Insert(PArray parr,int pos,int data)//pos范围是0到parr->len - 1 
{
	int i = 0;
	if((pos < 0) || ((pos > parr->len - 1) && (parr->len > 0)) || (parr ->len == parr->cap))
	{	
		return 0;	
	}
	for(i = parr->len - 1;i >= pos;i--)
	{
		parr->arr_base[i + 1] = parr->arr_base[i];
	}
	parr->arr_base[pos] = data;
	parr->len++;
	return 1;	
}

int Array_Find(PArray parr,int data)//查找元素 
{
	int i = -1;
	for(i = 0;i < parr->len;i++)
	{
		if(data == parr->arr_base[i])
		{
			break;
		}
	}
	if(i == parr->len)
	{
		return -1;
	}
	return i;
}

int Array_Delete(PArray parr,int data)
{
	int i = 0;
	int pos = Array_Find(parr,data);
	if(pos < 0)
	{
		return 0;
	} 
	if((pos < 0) || (pos > parr->len - 1) || (parr ->len == parr->cap))
	{
		return 0;	
	}
	for(i = pos;i < parr->len - 1;i++)  
	{
		parr->arr_base[i] = parr->arr_base[i + 1];
	}
	parr->len--;
	return 1;	
}

int main()
{
	PArray parr = NULL;
	int cap = 20;
	int i = 0;
	parr = Array_Init(cap);
	if(NULL == parr)
	{
		printf("内存分配失败\n");
	}
	for(i = 0;i < 10;i++)
		Array_Append(parr,i);
	Array_Print(parr);
	Array_Insert(parr,0,-1);
	Array_Print(parr);
	Array_Delete(parr,-1);
	Array_Print(parr);
	return 0;
}

7、运行效果

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

C语言实现顺序表 的相关文章

  • 使用 ## 和 __LINE__ 创建 C 宏(与定位宏的标记串联)

    我想创建一个 C 宏来创建一个基于名称的函数 在行号上 我想我可以做类似的事情 真正的函数在大括号内有语句 define UNIQUE static void Unique LINE void 我希望能扩展到类似的内容 static voi
  • 在 JavaScript 中引用 C# 变量

    我已经阅读了很多线程 但我不明白为什么这不起作用 我正在创建一个将用作导航栏的 SharePoint Web 部件 一切都很顺利 直到我尝试在 JS 代码中引用 C 变量 这是来自 VisualWebPart1UserControl asc
  • 检查数据库中是否存在记录

    我正在使用这些代码行来检查记录是否存在 SqlCommand check User Name new SqlCommand SELECT FROM Table WHERE user txtBox UserName Text conn int
  • 从 unsigned char* 到 char* 的转换无效

    这是一个代码 1 int main int argc char argv 2 3 signed char S psc 4 unsigned char U pusc 5 char C pc 6 7 C S 8 C U 9 10 pc psc
  • 如何将 mat 转换为 array2d

    我为dlib http dlib net face landmark detection ex cpp html那里的面部地标代码使用 array2d 来获取图像 但我喜欢使用 Mat 读取图像并转换为 array2d 因为 dlib 仅支
  • C++ 中可以使用匿名类作为返回类型吗?

    有没有办法在 C 中使用匿名类作为返回类型 我用谷歌搜索这可能有效 struct Test fun 但是这段代码无法编译 错误信息是 新类型不能在返回类型中定义 其实代码没有任何意义 我只是想弄清楚匿名类是否可以用作C 中的返回类型 这是我
  • 使用正则表达式解析日志文件

    我目前正在为我们的内部日志文件 由 log4php log4net 和 log4j 生成 开发一个解析器 到目前为止 我有一个很好的正则表达式来解析日志 除了一个烦人的一点 一些日志消息跨越多行 我无法正确匹配 我现在的正则表达式是这样的
  • 如何从命名空间内重载运算符<<

    这是我能想到的最小的包含示例 首先是类的标题 每当使用 pragma once ifndef EURO H define EURO H include
  • Xcode 新手无法用 C++ 打开文件?

    我一直在我参加的课程中使用 Windows 但我正在尝试运行基本代码来弄清楚如何从 Xcode 上的文件打开 关闭 输入 输出 而我通常在 Visual Studio 上使用的代码不是不知道为什么 谢谢 include
  • 如何使用 Selenium Webdriver .NET 绑定设置 Chrome 首选项?

    这是我正在使用的 用户代理可以成功设置 而下载首选项则不能 Windows 7 Chrome 26 Selenium dotnet 2 31 2 chromedriver win 26 0 1383 0 ChromeOptions chro
  • Bazel:将编译标志添加到默认 C++ 工具链

    我想向默认的 C 工具链添加一些编译器和链接器标志 以便我构建的所有目标 本地或导入 共享它们 我知道可以定义我自己的工具链 但我不想这样做 因为它非常复杂且容易出错 理想情况下我想要这样的东西 cc toolchain cc defaul
  • VS C# 中的依赖地狱,找不到依赖项

    我创建了一个图表 C 库 我们称之为chartlibrary 它本身依赖于多个第三方 dll 文件 在另一个可执行项目中 我们称之为chartuser 我参考了chartlibrary项目 两个项目位于 Visual Studio 中的同一
  • 使用 C# 的异步 WebRequest

    您好 我有一个函数 它将 url Get 参数传递到网络服务器上的 php 文件 并等待文件的响应 通常需要 10 20 秒 我想将其放入一个循环中 因为我必须一次将这些 Get 请求发送到大约 5 个不同的 php 文件 但是当我尝试将其
  • PowerShell 与 MongoDB C# 驱动程序方法不兼容?

    由 C 泛型引起的最新 MongoDB 驱动程序的问题 Cannot find an overload for GetCollection and the argument count 1 我可能可以使用其他没有泛型的 GetCollect
  • 如何使用 MongoDB 实现 ASP.NET Core 3.1 Identity?

    是一个 API 用于简化后端和逻辑代码来管理用户 密码 个人资料数据 角色 声明 令牌 电子邮件确认等 对于 Visual Studio 来说 支撑脚手架 https learn microsoft com en us aspnet cor
  • 智能感知不显示评论

    如果我在 Visual Studio 2010 中输入类似的内容数据集1 我得到所有可用方法和属性的列表 智能感知 这很好用 但是 如果我在此列表中选择一个方法或属性 我不会得到 if 的描述 例如 如果我有类似的东西 public cla
  • OpenCV 仅围绕大轮廓绘制矩形?

    第一次发帖 希望我以正确的方式放置代码 我正在尝试检测和计算视频中的车辆 因此 如果您查看下面的代码 我会在阈值处理和膨胀后找到图像的轮廓 然后我使用 drawContours 和矩形在检测到的轮廓周围绘制一个框 我试图在 drawCont
  • 如何编写完全可移植的 4 字节字符常量的编译时初始化

    遗留 代码大致如下所示 define MAKEID a b c d UInt32 a lt lt 24 UInt32 b lt lt 16 UInt32 c lt lt 8 UInt32 d define ID FORM MAKEID F
  • 在地图上使用 find

    如何使用 find 和 aconst iterator如果你有一个地图定义为 typedef std pair
  • 使用 ImageResizer 获取图像尺寸的最佳方法

    我正在将现有的 MVC 4 网站从自制用户文件上传切换为在上传时使用 ImageResizer 调整文件大小 我在文档中看到我不应该使用 System Drawing 但我无法找出任何其他获取图像尺寸的方法 尺寸是来自原始图像还是调整大小的

随机推荐

  • Lua: string字符串的处理

    目录 1 字符串的三种表示方式 2 字符串操作 3 特别说一下 dump序列化Lua 函数 1 字符串的三种表示方式 lua 字符串的三种表示 单引号字符串 string a hello world print string a 双引号字符
  • Selenium控制已打开的chrome、IE浏览器

    0 为什么要接管打开的浏览器 1 重复重新登录 过程麻烦 2 拖慢爬虫的运行速度 3 容易让网站检测到账号异常 如何解决重复登录的问题 1 使用登录过的cookie 下次运行时设置保存 2 接管打开的浏览器 也是我们接下来重点讲的 1 控制
  • 9.Markdown 高级技巧(内嵌HTML+公式+对齐方式)

    支持的 HTML 元素 CSDN支持kbd标签 有道云目前不支持 使用
  • Java基础面试题

    1 面向对象的特征有哪些方面 1 抽象 抽象就是忽略一个主题中与当前目标无关的那些方面 以便更充分地注意与当前目标有关的方面 抽象并不打算了解全部问题 而只是选择其中的一部分 暂时不用部分细节 抽象包括两个方面 一是过程抽象 二是数据抽象
  • 十分钟让你明白Objective-C的语法(和Java、C++的对比)

    很多想开发iOS 或者正在开发iOS的程序员以前都做过Java或者C 当第一次看到Objective C的代码时都会头疼 Objective C的代码在语法上和Java C 有着很大的区别 有的同学会感觉像是看天书一样 不过 语言都是相通的
  • smp和mpp计算机

    SMP 是Symmetric Multi Processing的简称 意为对称多处理系统 内有许多紧耦合多处理器 这种系统的最 大特点就是共享所有资源 MPP 另外与之相对立的标准是MPP Massively Parallel Proces
  • Linux驱动

    Linux驱动入门系列 Linux驱动入门 一 字符设备驱动基础 Linux驱动入门 二 操作硬件 Linux驱动入门 三 Led驱动 Linux驱动入门 四 非阻塞方式实现按键驱动 Linux驱动入门 五 阻塞方式实现按键驱动 Linux
  • ​7.1 项目1 学生通讯录管理:文本文件增删改查(C++版本)(自顶向下设计+断点调试) (A)​

    C 自学精简教程 目录 必读 作业目标 这个作业中 你需要综合运用之前文章中的知识 来解决一个相对完整的应用程序 作业描述 1 在这个作业中你需要在文本文件中存储学生通讯录的信息 并在程序启动的时候加载这些数据到内存中 2 在程序运行过程中
  • 用Python绘制六种可视化图表,简直太好用了

    前言 本文的文字及图片来源于网络 仅供学习 交流使用 不具有任何商业用途 如有问题请及时联系我们以作处理 PS 如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资料以及群交流解答点击即可加入 可视化图表
  • 邻接矩阵实现的带权有向图(C++)

    邻接矩阵实现的带权有向图 C 相关概念 定义和声明 实现 1 距离无穷大的定义 2 构造函数 3 深度优先遍历 4 广度优先遍历 6 将邻接矩阵转换为邻接表 7 重载 lt lt 运算符 打印输出 测试 测试代码 测试结果 源代码 相关概念
  • Callable 接口实现java 的多线程

    java 中创建多线程最常见的是继承Thread 的子类重写run 方法 还有就是实现Runnable 接口 我们最好使用实现了Runnable 接口的方法原因有两点 因为java 的单继承的特点 所以说使用第一种方法不能继承其他父类了 采
  • Lunix历史及如何学习

    1 Lunix是什么 1 1 Lunix是操作系统还是应用程序 Lunix是一套操作系统 它提供了一个完整的操作系统当中最底层的硬件控制与资源管理的完整架构 这个架构是沿袭Unix 良好的传统来的 所以相当的稳定而功能强大 Lunix具有核
  • SCI论文润色插件Product Content Checker扩展程序

    下载地址 https www gugeapps net webstore detail product content checker ilmaafbmfcklldgoehebccigadbkbdpc download 打开方式 直接将下载
  • simhash算法原理及实现

    一篇不错的介绍simhash的文章 如下 http blog csdn net chenguolinblog article details 50830948
  • 多个ajax请求时控制执行顺序或者等待执行完成后的操作

    当确保执行顺序时 一 请求加async false 这样所有的ajax就会同步执行 请求顺序就是代码顺序 代码部分 when ajax async false url url1 ajax async false url url2 done
  • ai绘画小程序基于novelai的tag列表源码展示(独家)

    视频 哔哩哔哩 看视频 介绍 一个tag列表展示
  • 代码行统计工具_cloc

    下载并运行 在Github下载稳定发布版本 Releases AlDanial cloc GitHub 直接下载exe文件 放在需要统计代码的文件夹下 用cmd或是powershell运行 cloc 1 96 exe 注意 之前有个空格 c
  • hive 错误 InvalidObjectException(message:Role admin already exists.)

    InvalidObjectException message Role admin already exists at org apache hadoop hive metastore ObjectStore addRole ObjectS
  • python去掉列表中的单引号_从Python中的列表中删除单引号

    我有一个输入字符串 result testing 0 8841 642000 0 80 014521 60 940653 4522126666 1500854400 1500842014000 name 80 014521 60 99653
  • C语言实现顺序表

    线性表是数据结构中的逻辑结构 线性表采用顺序存储的方式存储就称之为顺序表 数组是顺序表在实际编程中的具体实现方式之一 本篇主要介绍顺序表 顺序表的创建 添加元素 删除元素 遍历输出等操作 1 创建顺序表 1 1定义顺序表结构体 结构体包含三