(2)连续存储数组的方法

目录

连续存储的代表应用:数组

1)结构体的定义:

2)基本操作

对数据进行初始化

判断数组是否为空

输出数组

判断数组是否满

追加元素

插入数组元素

删除数组元素

逆序

对数组进行排序


这篇笔记是根据郝斌老师的上课讲义整理而得:

模块一:线性结构

        算法相当成熟;栈和队列是一种特殊的线性结构 把所有的节点用一根直线串起来

连续存储的代表应用:数组

     1. 什么叫数组
                 元素类型相同,大小相等
     2. 数组的优缺点:
                 存取速度快
                 插入元素很慢,空间通常是有限制的,需要知道数组的长度

1)结构体的定义:

#include <stdio.h> 
#include <malloc.h>//包含了malloc函数 
#include <stdlib.h>//包含了exit函数 

/*定义了一个数据类型,该数据类型的名字叫做struct Arr,
该数据类型含有三个成员,分别是pBase、len、cnt*/ 
struct Arr 
{ 
    int *pBase; //存储的是数组的第一个元素的地址 
    int len; //数组所能容纳的最大元素的个数             
    int cnt;//当前数组有效的元素的个数 
};

2)基本操作

void init_arr(struct Arr *pArr, int length);//对数组进行初始化
bool append_arr(struct Arr *pArr, int val); //追加元素 
bool insert_arr(struct Arr *pArr, int pose, int val);//插入数据元素
bool delete_arr(struct Arr *pArr, int pose,int *pVal);//删除数据元素,*pVal返回删除元素的值 
bool is_empty(struct Arr *pArr);//判断数组是否为空 
bool is_full(struct Arr *pArr);//判断数组是否满 
void sort_arr(struct Arr *pArr);//对数组进行排序,冒泡排序 
void show_arr(struct Arr *pArr);//输出数组 
void inversion_arr(struct Arr *pArr);//逆序

对数据进行初始化

void init_arr(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;
    }

    return;
}

判断数组是否为空

bool is_empty(struct Arr *pArr)
{
    if (0 == pArr->cnt)
        return True;
    else
        return false;
}

输出数组

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

判断数组是否满

bool is_full(struct Arr *pArr)
{
    if (pArr->cnt == pArr->len)
        return true;
    else
        return false;
}

追加元素

bool append_arr(struct Arr *pArr, int val) 
{ 
    if (is_full(pArr)) 
        return false;

    pArr->pBase[pArr->cnt] = val; 
    (pArr->cnt)++; 
    return true;
}

插入数组元素

bool insert_arr(struct Arr * pArr, int pos, int val)//在pose前面插入元素
{
	int i;
 
	if (is_full(pArr))
		return false;
 
	if (pos<1 || pos>pArr->cnt+1)
		return false;
 
	for (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_arr(struct Arr * pArr, int pos, int * pVal)
{
	int i;
 
	if ( is_empty(pArr) )
		return false;
	if (pos<1 || pos>pArr->cnt)
		return false;
 
	*pVal = pArr->pBase[pos-1];先进行赋值,以免进行删除操作之后没有返回值
	for (i=pos; i<pArr->cnt; ++i)
	{
		pArr->pBase[i-1] = pArr->pBase[i];
	}
	pArr->cnt--;
	return true;
}

逆序

void inversion_arr(struct Arr * pArr)
{
	int i = 0;
	int j = pArr->cnt-1;
	int t;
 
	while (i < j)
	{
		t = pArr->pBase[i];
		pArr->pBase[i] = pArr->pBase[j];
		pArr->pBase[j] = t;//两两交换
		++i;
		--j;
	}
	return;
}

对数组进行排序

void sort_arr(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;
			}
		}
	}
}

 

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值