數據結構基礎二-----之模塊一《線性存儲【數組】》

模塊一:線性存儲【把所有的結點用一根直線穿起來】

一:連續存儲[數組]  //所謂連續存儲  指的是地址連續

    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;
      }
    }
  }
}
 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章