数据结构基础二-----之模块一《线性存储【数组】》

模块一:线性存储【把所有的结点用一根直线穿起来】

一:连续存储[数组]  //所谓连续存储  指的是地址连续

    1.什么叫做数组

                    元素类型相同,大小相等

    2.数组的优缺点(相对于链表)

               优点:存取速度快

               缺点:实现必须知道数组的长度

                           需要大块连续的内存块

                           插入和删除元素很慢

                           空间通常是有限制的   

仿JAVA中ArrayList对象示例代码:

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

//定义了一个数据类型 该数据类型的名字叫做 struct Arr  该数据类型含有三个成员。
struct Arr
{
   int * pBase;//存储的是数组第一个元素的地址
   int len;//数组所能容纳的最大元素的个数
   int cnt;//当前数组有效元素的个数
   //int increment;//自动增长因子
   //这样的话就是每一次增长不是 一个一个的增长 而是一次增长一部分  
};

//函数声明的时候  末尾的分号是不能省得。
void init_arr(struct Arr * pArr,int length);//进行初始化

bool append_arr(struct Arr * pArr,int val);//追加 添加到末尾
bool insert_arr(struct Arr * pArr,int pos,int val);//pos的值从1 开始在 pso 位置的前面插入一个元素
bool  delete_arr(struct Arr * pArr,int pos,int *pVal);//用指针 返回删除的数据。
bool get();

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);//遍历数组

int main(void)
{
   struct Arr  arr;
   int val;
   init_arr(&arr,6);

   show_arr(&arr);

/* append_arr(&arr,1);
   append_arr(&arr,2);
   append_arr(&arr,3);
   append_arr(&arr,4);
   append_arr(&arr,5);
	
*/
   append_arr(&arr,1);
   append_arr(&arr,2);
   append_arr(&arr,3);
   append_arr(&arr,4);
   //insert_arr(&arr,5,99);
   show_arr(&arr);
/* if(delete_arr(&arr, 3, &val))
   {
     printf("删除成功\n");
     printf("您删除的元素是:%d\n",val);

   }
	
   else{
	printf("删除失败");
   }
*/
   inversion_arr(&arr);
   show_arr(&arr);
   sort_arr( &arr);
   show_arr(&arr);
		return 0;
}

void init_arr(struct Arr * pArr,int length)
{
   //(*pArr ).len = 99;
   pArr -> pBase = (int *) malloc(sizeof(int)*length);
   //如果内存已经用完 分配失败 返回NULL
   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;
}

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

void show_arr(struct Arr * pArr)
{
//   if(数组为空)
//	提示用户数组为空
//   else
//	输出数组有效内容
   if(is_empty(pArr))
   {
     printf("数组内容为空\n");	
   }
   else
   {	
      for(int i = 0;i<pArr->cnt;++i)
      {
	printf("%d\n",pArr->pBase[i]);
      }
      printf("\n");
   }
}

bool append_arr(struct Arr * pArr,int val)//追加 添加到末尾
{
   //满的时候返回false
   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)
{
  int  i;
  if(is_full(pArr))
     return false;
  if(pos<1 || pos>pArr->cnt+1)
  {
     return false;
  }
  for(i = pArr->cnt;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--;
   }
}

//数据结构中对排序的要求很多这里只是简单介绍  以后会重点讲
//这里讲的是冒泡排序
void sort_arr(struct Arr * pArr)
{
  int i ,j;
  int t;

  for(i = 0;i<pArr->cnt;++i)
  {
    for(j = 1;j<=pArr->cnt;++j)
    {
      if(pArr->pBase[j] <pArr->pBase[i])
      {
        t =pArr->pBase[i];
        pArr->pBase[i] = pArr->pBase[j];
        pArr->pBase[j] = t;
      }
    }
  }
}
 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值