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

来源:http://www.cnblogs.com/jiasheng/archive/2016/05/26/5529547.html
-Advertisement-
Play Games

第一次系統的學習數據結構是在半年前,看小甲魚的數據結構與演算法視頻,自學的話有許多不懂得地方,什麼AVL樹,紅黑樹,圖的最短路徑,最小生成樹...但總歸對數據結構與演算法有一個大體的印象,到現在隨著不斷寫代碼,做OJ題,愈發認識到數據結構與演算法的重要性,打算再看一遍,現在看著:大話數據結構(程傑著),數 ...


  第一次系統的學習數據結構是在半年前,看小甲魚的數據結構與演算法視頻,自學的話有許多不懂得地方,什麼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 }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、 webapi允許跨域的增刪改查要在web.config中加入以下文字 2、webapi支持特性路由,即在action上可以加上類似 [Route("RoleRights/{id}")]的特性路由,前提條件是要支持特性路由,即在WebApiConfig.cs的register的方法中添加MapH ...
  • 需求: 發送簡訊到用戶輸入手機, 要求可以自定義信息內容 問題: 沒有電信貓, 使用免費api介面無法自定義簡訊內容 解決方案: 通過4G網卡, 接在伺服器上, 通過AT指令操作網卡, 發送簡訊 查閱發現, AT質量發送需要對信息進行多重編碼, 而且發送超時, 但實際發送成功, 問題還未完全解決 代 ...
  • 這是一 個測試博客,用來測試客戶端發博客是否正常 public class UserFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container,... ...
  • 最近找實習, 在做Test Assignment時遇到了這麼道題, 就順便記錄下來:說, 有1到100共100個數, 擺成一個圈. 從1開始, 每隔1, 2, 3, 4 ... 個數拿走一個數, 一直迴圈, 最後剩下幾? 具體的講就是一開始(隔0個數)把 1 拿走, 隔1個數(2)把3拿走, 再隔2 ...
  • http://www.cnblogs.com/huangcong/archi s.strip() .lstrip() .rstrip(',') 去空格及特殊符號 複製字元串 Python 1 #strcpy(sStr1,sStr2) 2 sStr1 = 'strcpy' 3 sStr2 = sStr ...
  • 1、首先我們必須弄清楚什麼是冒泡排序,不理解冒泡排序的原理,我們就無法寫出代碼。 冒泡排序(BubbleSort)的基本概念是:依次比較相鄰的兩個數,將小數放在前面,大數放在後面。即在第一趟:首先比較第1個和第2個數,將小數放前,大數放後。然後比較第2個數和第3個數,將小數放前,大數放後,如此繼續, ...
  • 在使用Qt開發時,肯定是想讓開發的項目界面統一風格;不希望每個界面都要程式員用代碼去修飾美化以及進行事件處理等等,這樣非常繁瑣,容易出錯而且沒有格調;所以我就開發一個動態鏈接庫,封裝統一的風格界面、事件處理等等;自己開發的這個庫叫做CQU;CQU庫最終提供給用戶的文件只有如下三個文件: CQU.dl ...
  • 1.Appfuse是個什麼鬼? AppFuse是一個集成了當前最流行的Web應用框架的一個更高層次的Web開發框架。換句話說,AppFuse就是一個完整的各主流框架的整合版本。AppFuse總是能夠緊隨java的主流技術框架。 2.使用AppFuse的環境要求 JDK1.7+ MySQL5.5+ m ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...