程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C言語 數據構造之延續存儲數組的算法

C言語 數據構造之延續存儲數組的算法

編輯:關於C++

C言語 數據構造之延續存儲數組的算法。本站提示廣大學習愛好者:(C言語 數據構造之延續存儲數組的算法)文章只能為提供參考,不一定能成為您想要的結果。以下是C言語 數據構造之延續存儲數組的算法正文


數據構造之數組定義及根本操作

  數據構造中最根本的一個構造就是線性構造,而線性構造又分為延續存儲構造和團圓存儲構造。所謂的延續存儲構造其實就是數組。

  數組實質其實也是數據的一種存儲方式,既然有了數據的存儲,就會觸及到如何對數據停止尋址的問題。首先,先說一下在數組中數據是如何存儲的,在內存中,數組中的數據是以一組延續的數據集合的方式存在於內存中。當我們訪問存在於內存中的數組時,我們應該找到其在內存中的地址,當我們找到數據的地址後我們就可以找到對應的數據。理解了以上知識後,我們就可以停止數組的設計了(我們就可以設計自己的數組供他人去運用了,哈哈)。

  理解了以上知識後,第一個問題就來了,如何才干找到數據在內存中的地址?這個問題其實很復雜,由於數組在內存中是一組延續的數據集合,所以我們只需知道數組首地址,然後經過對應字節長度的加減就可以找到對應字節數的數據,有了這些就可以定義出我們的數組,但是,作為一個合理的數組,還應該無數組長度的標志len和數組無效元素的標志cnt。由此給出對數組的定義(本例中采用構造體,對構造體不理解的冤家可以去查一下)

struct Arr
{
  int *pBase; //存儲的是數組的第一個元素的地址
  int len; //數組所能包容的最大元素的個數
  int cnt; //數組無效元素的個數  

};

上述代碼定義了一個struct Arr的構造體,這個構造體就是一個數組,其中有存儲數組元素中首地址的成員,有存儲數組長度和數組無效元素個數的成員。

  有了對構造體的定義之後,就應該觸及到對數組的根本操作,包括數組的初始化,判別數組能否為空,對數組停止顯示,判別數組能否已滿,對數組的最後追加一個元素,對數組元素的拔出。其中,次要的算法就是對數組元素的拔出,拔出算法的中心就是首先應該先將被拔出及拔出地位之後的元素後移,然後將空出來的地位拔出我們要拔出的元素。一下給出c言語的完成:

/*
數組初始化函數 
初始化僅僅是給出一個具有一定長度的數組,但是數組中沒有無效值 
*/
void init_arr(struct Arr * pArr,int len)
{
  pArr->pBase=(int *)malloc(sizeof(int)*len);
  if(NULL==pArr->pBase){
    printf("靜態內存分配失敗");
    exit(-1); //終止整個順序 
  }
  else{
    pArr->len=len;
    pArr->cnt=0;
  }
}

/*
判別數組能否為空的函數 
*/ 
int is_empty(struct Arr * pArr){
  if(pArr->cnt==0){
    return 0;  //0代表true 
  }
  else{
    return 1;  //1代表false 
  }
}

/*
數組輸入顯示函數 
在停止數組輸入時,首先應該判別數組能否為空 
*/
void show_arr(struct Arr * pArr){  
  if(is_empty(pArr)==0){
    printf("以後數組為空!");
  }
  else{
    int i;
    for(i=0; i<pArr->cnt; ++i){
      printf("%d  ",pArr->pBase[i]);
    }
    printf("\n");
  }
}

/*
判別數組能否已滿的函數 
*/
int is_full(struct Arr * pArr){
  if(pArr->cnt==pArr->len){
    return 0; //0代表true,表示已滿 
  }
  else{
    return 1; //1代表false,表示未滿 
  }
}

/*
在數組的最後追加一個元素 
在追加數組元素前要判別以後數組能否已滿,已滿時不允許追加新的元素 
*/
int append_arr(struct Arr *pArr,int val){
  if(is_full(pArr)==0){
    return 0;
  }
  else{
    pArr->pBase[pArr->cnt]=val;
    pArr->cnt++;
    return 1;
  }
}

/*
在數組的指定地位拔出元素 
拔出算法:首先將被拔出地位的元素全部後移,然後再將空出來的地位拔出。
依據算法原理,所以,在拔出的時分應該反省數組能否已滿。 
上述兩種狀況均合理時,停止數據的拔出,拔出時,若拔出第三個地位,實踐是將數據賦值給arr[pos-1] 
留意:再將拔出地位後的元素後移時,應該從後向前挪動。否則,將會形成“被移到”的地位的值被掩蓋 
*/
int insert_arr(struct Arr *pArr,int pos,int val){
  if(is_full(pArr)==0){
    return 0; //0表示以後數組已滿,無法再停止拔出 
  }  
  //在數組可拔出的狀況下,應該反省用戶輸出的pos地位值能否合理
  if(pos<0||pos>(pArr->len)){
    return 1; //1表示以後用戶拔出地位不合法 
  } 
  //挪動地位 
  int i;
  for(i=pArr->cnt  -1;i>=pos-1;--i){
    pArr->pBase[i+1]=pArr->pBase[i];
  } 
  //空缺地位拔出元素
  pArr->pBase[pos-1]=val;
  return 2; //2表示以後拔出成功 
}

感激閱讀,希望能協助到大家,謝謝大家對本站的支持!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved