数组
把所有节点用一根直线串起来而形成的一种数据结构称为线性结构。
今天我想谈谈线性结构中的数组。大家都知道数组是连续存储的一种线性结构,而数组名为该数组元素的首地址。如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.进行增删改查时的位置及范围
结束语
有关数组的相关操作就写到这,若文中有不妥或有误的地方还请指点。 明天开始学习数据结构中最基本也是非常重要的线性结构中的离散存储结构---链表
分享到:
相关推荐
线性结构静态数组表示法,C实现源码,更多内容请见http://blog.csdn.net/zhongkelee
线性结构动态数组表示法,C实现源码,更多内容请见http://blog.csdn.net/zhongkelee
线性结构和非线性结构、稀疏数组、队列、链表(LinkedList) 数组和链表.pdf
树状数组算法分析树状数组可以解决数量级较大的区间求和问题,区间求最值问题,区间修改、查询问题以及求逆序对等应用。树状数组的时间复杂度O(log2n),正常情况下远远快于线性时间O(n)。
多维数组是一维数组的推广 多维数组是一种非线性结构。其特点是每一个数据元素可以有多个直接前驱和多个直接后继 数组元素的下标一般具有固定的下界和上界,因此它比其他复杂的非线性结构简单
C1 = 展平({{1 {2 3}} {4 5} 6}) C2 = flatten({{'a' {'b','c'}} {'d' 'e'} 'f'}) % 输出: C1 = [1] [2] [3] [4] [5] [6] C2 = 'a' 'b' 'c' 'd' 'e' 'f'
文章目录数据结构类型线性结构与非线性结构稀疏数组实例应用二维数组转稀疏数组的思路稀疏数组转原始的二维数组思路 数据结构类型 数据结构包括:线性结构和非线性结构。 线性结构与非线性结构 线性结构 线性结构...
数据结构之线性结构(一,表结构) 作者:冲出宇宙 时间:2006-10-24 修改:2006-11-3 转载请注明作者。 作者主要参考了www.answers.com 上面的资料(因为wikipedia上不去)和部分较新学术论文(一般来自于acm, IEEE...
Java-用数组实现栈-队列-线性列表(最详细) 有注释 适合java新生 进行数组的练习 3个数据结构的数组实现练习
数组是线性结构是容器类型,是一块连续的内存空间, iOS 中用 NSArray 和 NSMutableArray 集合类型,用来存放对象类型,其中 NSArray是不可变类型, NSMutableArray 是可变类型,能够对数组中元素进行增删改查. ...
数据结构是计算机科学中的一门重要课程,它主要研究数据的组织、存储和管理方式。...线性结构包括数组、链表、栈、队列等;树形结构如二叉树、平衡树、堆等;图形结构则涉及图、网络等复杂数据结构。
数据结构及算法导论 详细介绍线性表,栈和队列,串,多维数组及广义表,树,图,排序,查找等数据结构及算法描述,PDF格式,很清晰……
线性结构包括数组、队列、栈、链表等;非线性结构包括树、图等。此外,根据数据元素之间关系的不同特性,通常有四类基本结构,即集合结构、线性结构、树形结构和图形结构。 数据结构在计算机科学中有着广泛的应用,...
数据结构中最基本的一个结构就是线性结构,而线性结构又分为连续存储结构和离散存储结构。所谓的连续存储结构其实就是数组。 数组本质其实也是数据的一种存储方式,既然有了数据的存储,就会涉及到如何对数据...
经过一上午的学习,对数据结构有了新的认识和理解 数组 数组是由有限个相同类型的变量所组成的有序集合,...栈是一种线性逻辑结构,可以使用数组实现,也可以使用链表实现。包含入栈还有出栈操作,遵循先入后出的原则(F
二维数组基本操作的编程实现(2学时,验证型),掌握数组的建立、读取数据、压缩存储等基本操作的编程实现,存储结构可以在顺序结构或链接结构中任选,也可以全部实现。也鼓励学生利用基本操作进行一些应用的程序...
数组是平时使用最常用的数据结构,在JavaScript中数组是动态的分配大小,在这里我不会介绍JavaScript里面数组的所有的方法,而是针对数据结构这个方向谈谈所用到的方法。 创建和初始化数组 //创建空数组 var array =...
我自己写的三种线性数据结构的实现,即线性表\栈\队列的数组及链式实现
数据结构 线性表 实验代码 C语言 数组 支持大部分线性表操作,hust 赵明 虽是菜鸟,努力坚持学习
软件设计师(中级)-------数据结构 数据结构--线性结构-数组-矩阵和广义表-数-图-查找-排序