靜態鏈表代碼


 早期的編程語言不像C語言擁有指針功能,但是又希望能夠實現單鏈表,

於是在數組的基礎上創建了單鏈表,稱為靜態鏈表。

/************************************* 靜態鏈表 數據結構:每個數組節點都有值和游標. 游標表示下一個節點,節點分為已用節點和備用節點 第一個節點和最后節點保留: 第一個節點游標表示備用節點起始位置 最后一個節點游標表示已用節點的起始位置 已用節點的最后一個元素的游標指向0,表示末尾。 *************************************/ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <time.h>
#define ERROR 0
#define OK 1
#define MAX 100     //聲明數組的最大長度 typedef int Status,ElemType; typedef struct{ int data;    //數據
   int cur;     //游標
}component,staticlink[MAX]; //定義結構體數組

/********************************** 初始化鏈表 輸入值:鏈表的指針 輸出值:狀態碼 功能: 將所以節點的游標指向后一個節點 ***********************************/ Status initLink(staticlink space){ int i; for(i=0;i<(MAX-1);i++){  //遍歷所有節點
    space[i].cur = i+1;  //將節點的游標指向下個節點
 } space[MAX-1].cur = 0;    //最后一個節點的游標指向第一個節點
  return OK; } /********************************* 分配備用空間 輸入值:鏈表的指針 輸出值:備用節點的下標 功能: 將備用節點的分配出來使用 *********************************/
int mallocSpace(staticlink space){ int i; i = space[0].cur;          //取出第一個備用節點
  if(space[0].cur)           //如果取出成功
    space[0].cur = space[i].cur;    //第一個節點的指針往后移動
  return i; } /******************************** 獲取長度 輸入值:鏈表的指針 輸出值:長度值 功能: 將鏈表中已用的節點個數返回 ********************************/
int getLength(staticlink space){ int mov = MAX-1; int j=0; while(space[mov].cur){    //遍歷所有已用節點
    mov = space[mov].cur; j++; } return j; } /********************************* 創建值 輸入值:鏈表的指針,初始值個數 輸出值:狀態碼 功能: 為鏈表初始指定個數的隨機值 *********************************/ Status createValue(staticlink space,int num){ srand(time(0)); int i,mov = MAX-1; space[mov].cur = 1; for(i=0;i<num;i++){ mov = space[mov].cur;        //移動游標
    space[mov].data = rand()%100+1;  //初始化隨機值
 } space[0].cur = space[mov].cur;     //第一節點游標指向備用節點
  space[mov].cur = 0;           //最后一個已用節點指向第一個節點
  return OK; } /********************************* 插入節點 輸入值:鏈表的指針,插入位置(從1開始),插入位置 輸出值:狀態碼 功能: 在指定的位置插入指定的值 *********************************/ Status insertNode(staticlink space,int index,ElemType e){ int new,mov,i; if(index<1 || index>getLength(space))return ERROR;  //不可以超過已用節點個數
 mov = MAX-1; new = mallocSpace(space); if(new){ space[new].data=e;            //創建新節點
    for(i=1;i<index;i++)           //定位插入節點的前一節點
      mov = space[mov].cur; space[new].cur = space[mov].cur;    //連后
    space[mov].cur = new;          //接前
    return OK; } return ERROR; } /************************************ 刪除節點 輸入值:鏈表的指針,刪除位置(從1開始) 輸出值:狀態碼 功能: 刪除指定的節點 ************************************/ Status deleteNode(staticlink space,int index){ if(index<1 || index>getLength(space))return ERROR; int mov,next,i; mov = MAX-1; for(i=1;i<index;i++)        //定位刪除節點的前一節點
    mov = space[mov].cur; next = space[mov].cur;       //獲取被刪節點
  space[mov].cur = space[next].cur; //前一節點連接被刪節點的游標
  freeNode(space,next);       //釋放被刪節點
  return OK; } /*********************************** 釋放節點 輸入值:鏈表的指針,釋放節點的位置 輸出值:狀態碼 功能: 將已用節點釋放成備用節點 ***********************************/ Status freeNode(staticlink space,int target){ space[target].cur = space[0].cur;        //釋放節點連接第一備用節點
  space[0].cur = target;              //第一節點連接釋放節點
  return OK; } /********************************** 輸出鏈表 輸入值:鏈表的指針 輸出值:狀態碼 功能: 將鏈表的值一一輸出 **********************************/ Status printLink(staticlink space){ int mov = MAX-1; while(space[mov].cur){ mov = space[mov].cur; printf("[%d] ",space[mov].data); } printf("\n"); return OK; } int main(){ int num,value,index; staticlink L; initLink(L); printf("[create]enter num:"); scanf("%d",&num); createValue(L,num); printLink(L); printf("[insert]enter index:"); scanf("%d",&index); printf("[insert]enter value:"); scanf("%d",&value); insertNode(L,index,value); printLink(L); printf("[delete]enter index:"); scanf("%d",&index); deleteNode(L,index); printLink(L); return 0; }

 

 運行效果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM