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

来源:互联网 发布:淘宝的手机能买吗 编辑:程序博客网 时间:2024/06/06 12:33

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

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

    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