C语言实现线性数据结构中的数组

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

struct Arr{
	int * pBase;//数组中第一个元素的地址 
	int len;//数组的长度 
	int cnt;//当前数组中有效元素的个数 
}; 

//函数原型的声明 
void InitArr(struct Arr *pArr,int length);//初始化数组 
void ShowArr(struct Arr *pArr); //输出数组
bool IsEmpty(struct Arr *pArr);//判断数组是否为空
bool IsFull(struct Arr *pArr);//判断数组是否为满
bool Append(struct Arr *pArr,int val);//在数组的后面追加一个元素
bool Insert(struct Arr *pArr,int pos,int val);//向指定位置插入元素
bool Delete(struct Arr * pArr,int pos,int *pVal);//删除数组中指定位置的元素并返回所删除元素的值
void Inverse(struct Arr * pArr);//反转数组  
void Sort(struct Arr * pArr);//对数组进行从小到大排序或者从大到小
//void Search();//查找数组中某个元素并返回其下标

int main()
{
	struct Arr arr;
	InitArr(&arr,6);//分配存储6个整型的连续存储空间 
	printf("初始化之后的数组:\n");
	ShowArr(&arr);// 此时数组为空 
	Append(&arr,1);
	Append(&arr,2);
	Append(&arr,3);
	Append(&arr,4);
	printf("追加元素之后的数组:\n");
	ShowArr(&arr); //数组输出为:1 2 3 4 
	if(Insert(&arr,2,5)){//在第2个位置(从1开始计数)插入元素5
		printf("插入成功!\n");
	}
	printf("插入元素之后的数组:\n");
	ShowArr(&arr); //输出结果为:1 5 2 3 4
	int val;
	//函数返回类型为bool,所以加一个if判断 
	if(Delete(&arr,2,&val)){
		printf("删除成功!\n");
		printf("删除的元素为:%d\n",val);
	}
	printf("删除元素之后的数组:\n");
	ShowArr(&arr);//输出为:1 2 3 4 
	Inverse(&arr);
	printf("反转之后的数组:\n");
	ShowArr(&arr); //输出为4 3 2 1 
	Sort(&arr);
	printf("排序后的数组为:\n");
	ShowArr(&arr); 
	return 0;
 } 

void InitArr(struct Arr *pArr,int length)//初始化数组
{
	pArr->pBase = (int*) malloc(sizeof(int)*length);
	if(NULL == pArr->pBase){
		printf("动态内存分配失败!\n");
		exit(-1);
	}
	else{
		pArr->len = length;
		pArr->cnt = 0;
	}
} 

void ShowArr(struct Arr *pArr)//输出数组
{
	//首先判断数组是否为空,若为空,提示用户
	if(IsEmpty(pArr))
		printf("数组为空!\n");
	else{
		for(int i = 0;i < pArr->cnt;++i){
			printf("%d  ",pArr->pBase[i]);
		}
	printf("\n");
	return;
	} 
} 

bool IsEmpty(struct Arr *pArr)//判断数组是否为空
{
	if(pArr->cnt == 0)
		return true;
	else
		return false;
 } 

bool IsFull(struct Arr *pArr)//判断数组是否为满
{
	if(pArr->cnt == pArr->len)
		return true;
	else
		return false;
}
 
bool Append(struct Arr *pArr,int val)//追加一个元素 
{
	if(IsFull(pArr))//如果数组满,返回false 
		return false;
	pArr->pBase[pArr->cnt] = val;//好好理解一下 
	(pArr->cnt)++;
	return true;	
}

bool Insert(struct Arr * pArr,int pos,int val)//向数组中第i个位置插入一个值,三个参数:插入的数组、插入的位置和插入的元素 
{
	//判断数组是否已满
	if (IsFull(pArr)) 
		return false;
	//判断插入位置是否合法
	if(pos > pArr->cnt + 1 || pos < 1)//pos是从1开始的,但是数组下标是从0开始的,不要混淆 
		return false;
	//进行插入操作(注:数组下标从0开始 ,访问数组通过下标来进行) 
	for(int i = pArr->cnt-1; i >= pos-1;i--){//试数的办法 
		pArr->pBase[i+1] = pArr->pBase[i];//将元素一个一个往后移动 
	}
	pArr->pBase[pos-1] = val;
	(pArr->cnt)++;//数组的有效长度加一
	return true;	
}

bool Delete(struct Arr * pArr,int pos,int *pVal)//删除数组中某一个元素 ,三个参数:删除元素的数组,删除的位置以及返回所删除的元素(指针类型) 
{
	//判断数组是否为空 
	if (IsEmpty(pArr)) 
		return false;
	//判断删除的位置是否合法
	if(pos > pArr->cnt+1 || pos < 1)//pos是从1开始的,但是数组下标是从0开始的,不要混淆 
		return false;
	//进行删除操作
	*pVal = pArr->pBase[pos-1];//返回删除的元素 
	for(int i = pos;i < pArr->cnt;++i){
		pArr->pBase[i-1] = pArr->pBase[i];//将元素一个一个往后移动 
	}
	pArr->cnt--;//数组的有效长度减一
	return true; 
}

void Inverse(struct Arr * pArr)//反转数组 
{
	int i = 0,j = pArr->cnt-1,temp;
	while(i < j){
		temp = pArr->pBase[i];
		pArr->pBase[i] = pArr->pBase[j];
		pArr->pBase[j] = temp;
		++i;
		--j;
	}
}

void Sort(struct Arr * pArr)//对数组进行从小到大排序或者从大到小
{
	int i,j,t;
	for(i = 0;i < pArr->cnt;++i){//这里使用的是冒泡排序 
		for(j = i+1;j < pArr->cnt;++j){
			if(pArr->pBase[i] > pArr->pBase[j]){
				t = pArr->pBase[i];
				pArr->pBase[i] = pArr->pBase[j];
				pArr->pBase[j] = t;
			}
		}
	}
}

运行的结果为:

重新回顾数据结构,为后面的刷题做好准备,数据结构是去年自学的,现在已经忘得差不多了。这个笔记主要是为了方便自己温习,也希望能够对其他人提供一些帮助。所有大厂的面试,编程技能是一定会考查的。假如偏硬件,只接触过C语言,但别人还是会问你关于数据结构的内容。其实,做嵌入式开发,对编程的要求也是蛮高的。如果是软件开发岗,那数据结构和算法更是没得跑。编程语言只是达到目标的一种手段,数据结构和算法才是核心竞争力。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吾日叁問

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值