当前位置: 首页 > news >正文

线性结构之数组

数组

       把所有节点用一根直线串起来而形成的一种数据结构称为线性结构。

       今天我想谈谈线性结构中的数组。大家都知道数组是连续存储的一种线性结构,而数组名为该数组元素的首地址。如int a[3]={1,2,3};a就等价于&a[0],而&a[0]本身是int *类型,所以我们通常利用数组名来与指针建立联系,进而跨函数使用内存对数组进行操作。

 

实例说明:

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
struct Arr
{
	int* pBase;//pBase存储的是数组第一个元素的地址
	int len;//len为数组所能容纳的最大元素的个数
	int cnt;//当前数组有效元素的个数
};
void InitArray(struct Arr *pArr,int length);//初始化数组
void AppendArray(struct Arr *pArr,int val);//尾部追加数据
int IsFull(struct Arr *pArr);//判断数组是否已满(我的这个vc++编译器不知道为什么,函数返回值不能为bool型;所以这里我把它设置成int型来判断)
void ShowArray(struct Arr *pArr);//输出显示
int IsEmpty(struct Arr *pArr);//判断数组是否为空
void DeleteArray(struct Arr *pArr,int pos,int *pVal);//删除元素,pVal指向pos(从1开始)位置的值
void InsertArray(struct Arr *pArr,int pos,int val);//插入元素,pos从1开始
void SortArray(struct Arr *pArr);//排序,因为初学数据结构,我这里用的是冒泡排序法
void InverseArray(struct Arr *pArr);//倒置
void GetByPostion(struct Arr *pArr,int pos);//根据位置来查找元素
void ModifyArray(struct Arr *pArr,int pos,int val);//修改元素元素,pVal指向pos(从1开始)位置的值
int main()
{
	struct Arr arr;//为arr分配内存
	int val;
    InitArray(&arr,6);
    AppendArray(&arr,7);
	AppendArray(&arr,2);
	AppendArray(&arr,5);
	AppendArray(&arr,9);
	printf("初始化");
	ShowArray(&arr);
    InsertArray(&arr,4,6);
	printf("插入后");
    ShowArray(&arr); 
	DeleteArray(&arr,3,&val);
	printf("删除的元素为:%d\n",val);
	printf("删除后");
	ShowArray(&arr); 
	SortArray(&arr);	
	printf("排序后");
	ShowArray(&arr); 
	InverseArray(&arr);
	printf("倒置后");
	ShowArray(&arr);
	GetByPostion(&arr,2);
	ModifyArray(&arr,1,1000);
	printf("修改后");
	ShowArray(&arr);
	return 0;
}

void InitArray(struct Arr *pArr,int length)
{
	pArr->pBase=(int *)malloc(sizeof(int)*length);//为结构体成员pBase动态分配一块内存
	if(NULL==pArr->pBase)
	{
		printf("动态内存分配失败!");
		exit(1);//终止整个程序
	}
	else
	{
		pArr->len=length;
		pArr->cnt=0;
	}
}

int IsFull(struct Arr *pArr)
{
	if(pArr->cnt==pArr->len)
		return 1;
	else
		return -1;
}

void AppendArray(struct Arr *pArr,int val)
{
	if(1==IsFull(pArr))
		printf("数组已满,越界元素添加失败!\n");
	else 
		pArr->pBase[pArr->cnt++]=val;
}

int IsEmpty(struct Arr *pArr)
{
	if(0==pArr->cnt)
		return 1;
	else
		return -1;
}

void ShowArray(struct Arr *pArr)
{
	int i;
	if(1==IsEmpty(pArr))
		printf("数组为空!\n");
	else
	{
		printf("数组元素为:");
		for(i=0;i<pArr->cnt;i++)
			printf("%d  ",pArr->pBase[i]);
		printf("\n");
	}
}

void DeleteArray(struct Arr *pArr,int pos,int *pVal)
{
	int i;
	if(1==IsEmpty(pArr))
		printf("数组为空!\n");
	else
	{
		if(pos<1||pos>pArr->cnt)
			printf("删除操作有误!%d删除失败!\n",*pVal);
		else
		{
			*pVal=pArr->pBase[pos-1];//要删除的元素
			for(i=pos;i<pArr->cnt;i++)
				pArr->pBase[i-1]=pArr->pBase[i];
			pArr->cnt--;
		}
	}
}

void InsertArray(struct Arr *pArr,int pos,int val)
{
	int i;
	if(1==IsFull(pArr))
		printf("数组已满,不能就行插入!\n");
	else
	{
		if(pos<1||pos>pArr->cnt)
			printf("插入操作有误!%d插入失败!\n",val);
		else
		{
			for(i=pArr->cnt-1;i>=pos-1;i--)
				pArr->pBase[i+1]=pArr->pBase[i];
			pArr->pBase[pos-1]=val;
			pArr->cnt++;
		}
	}
}

void SortArray(struct Arr *pArr)
{
	int i,j,t;
	for(i=0;i<pArr->cnt-1;i++)
	{
		for(j=0;j<pArr->cnt-i-1;j++)
		{
			if(pArr->pBase[j]>pArr->pBase[j+1])
			{
				t=pArr->pBase[j];
				pArr->pBase[j]=pArr->pBase[j+1];
				pArr->pBase[j+1]=t;
			}
			
		}
	}	
}

void InverseArray(struct Arr *pArr)
{
	int i,t;
	for(i=0;i<pArr->cnt/2;i++)
	{
		t=pArr->pBase[i];
        pArr->pBase[i]=pArr->pBase[pArr->cnt-i-1];
		pArr->pBase[pArr->cnt-i-1]=t;
	}
	return; 
}

void GetByPostion(struct Arr *pArr,int pos)
{
	if(1==IsEmpty(pArr))
		printf("数组为空!\n");
	else
	{
		if(pos<1||pos>pArr->cnt)
	    	printf("修改操作操作有误!\n");
		else
			printf("\n查找%d号位置的元素为:%d\n",pos,pArr->pBase[pos-1]);
	}
}

void ModifyArray(struct Arr *pArr,int pos,int val)
{
	if(1==IsEmpty(pArr))
		printf("数组为空!\n");
	else
	{
		if(pos<1||pos>pArr->cnt)
			printf("修改操作操作有误!\n");
		else
			pArr->pBase[pos-1]=val;
	}
}


 

 注意:

           1.数组为空

            2.数组越界    

            3.进行增删改查时的位置及范围

 

结束语

         有关数组的相关操作就写到这,若文中有不妥或有误的地方还请指点。 微笑 明天开始学习数据结构中最基本也是非常重要的线性结构中的离散存储结构---链表

 

 

 

转载于:https://www.cnblogs.com/jave-lover/p/3589771.html

相关文章:

  • js,query 选择radio+选中select+checkbox选中
  • Nagiso 监控服务器的RAID磁盘阵列状态
  • java 面试题解惑一 类的初始化顺序
  • Java虚拟机支持的最大内存限制
  • protobuf编码规则
  • Azure Web应用中设置静态虚拟目录的方法(比如部署Django需要用到)
  • Java左右补齐字符长度
  • Samba服务器搭建
  • linux 安装php
  • 算法导论
  • 走近复杂数据库计算型软件的设计与制作(3)—视图的设计
  • fstrict-aliasing
  • mybatis-入门
  • iptables入门 (取自鸟哥的Linux私房菜)
  • Linux(CentOS)安装rar和unrar以及rar和unrar命令的使用
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • iOS编译提示和导航提示
  • JSDuck 与 AngularJS 融合技巧
  • js如何打印object对象
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • React Native移动开发实战-3-实现页面间的数据传递
  • springboot_database项目介绍
  • Yeoman_Bower_Grunt
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 高度不固定时垂直居中
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 手写一个CommonJS打包工具(一)
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 一个完整Java Web项目背后的密码
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 走向全栈之MongoDB的使用
  • Hibernate主键生成策略及选择
  • 阿里云重庆大学大数据训练营落地分享
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • ​如何防止网络攻击?
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (Git) gitignore基础使用
  • (八)Spring源码解析:Spring MVC
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (三)终结任务
  • (一)Thymeleaf用法——Thymeleaf简介
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (原創) 未来三学期想要修的课 (日記)
  • ..回顾17,展望18
  • .a文件和.so文件
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .net Signalr 使用笔记
  • .NET关于 跳过SSL中遇到的问题
  • @AliasFor注解
  • @RequestMapping处理请求异常