程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 能判斷是否還有剩余空間的靜態鏈表,剩余靜態

能判斷是否還有剩余空間的靜態鏈表,剩余靜態

編輯:關於C語言

能判斷是否還有剩余空間的靜態鏈表,剩余靜態


  第一次系統的學習數據結構是在半年前,看小甲魚的數據結構與算法視頻,自學的話有許多不懂得地方,什麼AVL樹,紅黑樹,圖的最短路徑,最小生成樹...但總歸對數據結構與算法有一個大體的印象,到現在隨著不斷寫代碼,做OJ題,愈發認識到數據結構與算法的重要性,打算再看一遍,現在看著:大話數據結構(程傑著),數據結構(C語言版嚴蔚敏著),不推薦新手使用 數據結構與算法分析(Mark Allen Weiss 著)這本書真的很難懂。

  回歸正題,我看了許多書有關靜態鏈表的描述和代碼發現都沒有判斷是否還有剩余空間,自己琢磨了一個晚上把代碼弄好了。

  1 #include <stdio.h>      //Anjaxs
  2 #include <stdbool.h>
  3
  4 #define MAXSIZE  7
  5 typedef  int ElemType;
  6 
  7 typedef struct{
  8     ElemType data;
  9     int cur;
 10 }StaticList;
 11 
 12 int Malloc_SL(StaticList * space);
 13 void Free_SL(StaticList * space, int k);
 14 void InitList(StaticList * space); 
 15 bool ListInsert(StaticList * L, int i, ElemType e);
 16 bool ListDelete(StaticList * L, int i);
 17 int ListLength(StaticList * L);
 18 void show(StaticList * L);
 19 
 20 int main()
 21 {
 22     int i;
 23     int choice;
 24     StaticList L[MAXSIZE];
 25     InitList(L);
 26     printf("1:插入 2:刪除 3:輸出 0:退出\n");
 27     while (scanf("%d",&choice) && choice!=0)
 28     {
 29         int x;
 30         int pos;
 31         switch (choice)
 32         {
 33             case 1:
 34                 printf("輸入要插入的數字和位置\n");
 35                 scanf("%d %d", &x, &pos);
 36                 ListInsert(L, pos, x);
 37                 break;
 38             case 2:
 39                 printf("輸入要刪除的位置\n");
 40                 scanf("%d",&pos);
 41                 ListDelete(L, pos);
 42                 break;
 43             case 3:
 44                 show(L);
 45                 break;
 46             default:
 47                 printf("請輸入1-3.\n");
 48                 break;
 49         }
 50         printf("1:插入 2:刪除 3:輸出 0:退出\n");
 51     }
 52 
 53     return 0;
 54 }
 55 
 56 
 57 void InitList(StaticList *space)
 58 {
 59     int i;
 60     //space[0].cur為指向第一個空閒位置的指針
 61     //space[MAXSIZE-1].cur為頭指針
 62     for (i = 0; i < MAXSIZE-1; ++i){
 63         space[i].data = 0;
 64         space[i].cur = i+1;
 65     }
 66     //目前靜態鏈表為空,最後一個元素的cur為0
 67     space[MAXSIZE-1].cur = 0;
 68     space[MAXSIZE-1].data = 0;
 69 }
 70 
 71 bool ListInsert(StaticList *L, int i, ElemType e)
 72 {
 73     int j, k, l;
 74     k = MAXSIZE-1;
 75     if (i < 1 || i > ListLength(L)+1){
 76         printf("請輸入合法的位置。\n");
 77         return false;
 78     }
 79     if (ListLength(L) >= MAXSIZE-2)
 80     {
 81         printf("沒有空閒空間了。\n");
 82         return false;
 83     }
 84     j = Malloc_SL(L);
 85     if (j)
 86     {
 87         L[j].data = e;
 88         for (l = 1; l <= i-1; ++l)
 89             k = L[k].cur;
 90         L[j].cur = L[k].cur;
 91         L[k].cur = j;
 92         return true;
 93     }
 94     
 95     return false;
 96 }
 97 
 98 bool ListDelete(StaticList * L, int i)
 99 {
100     int j, k;
101     if (i < 1 || i > ListLength(L)){
102         printf("請輸入合法的位置。\n");
103         return false;
104     }
105     
106     k = MAXSIZE-1;
107     for (j = 1; j <= i-1; ++j)
108         k = L[k].cur;
109     j = L[k].cur;
110     L[k].cur = L[j].cur;
111     Free_SL(L,j);
112     return true;
113 }
114 
115 int ListLength(StaticList * L)
116 {
117     int j = 0;
118     int i = L[MAXSIZE-1].cur;
119     while (i)
120     {
121         i = L[i].cur;
122         j++;
123     }
124 
125     return j;
126 }
127 
128 int Malloc_SL(StaticList * space)
129 {
130     //返回第一個備用空閒的下標
131     int i = space[0].cur;
132     
133     if (space[0].cur)
134         space[0].cur = space[i].cur;
135     
136     return i;    
137 }
138 
139 void Free_SL(StaticList * space, int k)
140 {
141     space[k].cur = space[0].cur;
142     space[0].cur = k;
143 }
144 
145 void show(StaticList * L)
146 {
147     int i;
148     printf("%30s\n","靜態鏈表");
149     printf("%8s","index:");
150     for (i=0 ; i<MAXSIZE ; ++i)
151     {
152         printf("%5d ",i);
153     }
154     printf("\n%8s","data:");
155     for (i=0 ; i<MAXSIZE ; ++i)
156     {
157         printf("%5d ",L[i].data);
158     }
159     printf("\n%8s","cur:");
160     for (i=0 ; i<MAXSIZE ; ++i)
161     {
162         printf("%5d ",L[i].cur);
163     }    
164     printf("\n\n");
165     i = L[MAXSIZE-1].cur;
166     while (i)
167     {
168         printf("%d->", L[i].data);
169         i = L[i].cur;
170     }
171     printf("^\n\n");
172 }

 

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