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

来源: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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...