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语言实现顺序表 的相关文章

随机推荐

  • 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定义顺序表结构体 结构体包含三