久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: C語言動態順序表源程序 [打印本頁]

作者: 老馬工作室    時間: 2019-4-1 17:42
標題: C語言動態順序表源程序
最近在學習stm32的時候發現自己的c語言基礎還停留在c51的水平,因此做一些練習提高自己的c語言水平。
我參考了 《妙趣橫生的算法-c語言實現》這本書,建議大家從書 店入手

  1. #include <stdio.h>

  2. #include <mallco.h>              // 使用malloc函數要包含這個文件
  3. #include <assert.h>


  4. #define INIT_CAPACITY 10  // 初始化時分配的容量


  5. typedef struct seqlist{
  6.     int *array;        // 存儲空間的基地址
  7.     int size;          // 有效元素個數
  8.     int capacity;      // 當前分配的存儲容量
  9. }SEQLIST;


  10. void seqlist_init(SEQLIST *list);          //初始化順序表
  11. void check_capacity(SEQLIST *list);        // 檢查是否滿

  12. void push_front(SEQLIST *list, int value);  // 在順序表前頭部插入元素
  13. void push_back(SEQLIST *list, int value);   // 在順序表尾部插入元素
  14. void insert_list(SEQLIST *list, int pos, int value);        // 在pos這個位置插入元素

  15. void pop_front(SEQLIST *list);              // 刪除順序表第一個元素
  16. void pop_back(SEQLIST *list);               // 刪除順序表最后一個元素

  17. void list_printf(SEQLIST *list);            // 遍歷順序表
  18. void destroy_list(SEQLIST *list);           // 摧毀順序表
  19. void list_cleardata(SEQLIST *list);         // 清空順序表的數據


  20. int main(void)
  21. {
  22.     SEQLIST list;
  23.    
  24.     seqlist_init(&list);
  25.     push_front(&list, 3);
  26.     push_front(&list, 2);
  27.     push_front(&list, 1);
  28. //    list_printf(&list);
  29.    
  30.     push_back(&list, 3);
  31.     push_back(&list, 2);
  32.     push_back(&list, 1);
  33.     pop_back(&list);
  34.     pop_front(&list);
  35.     insert_list(&list, 3, 4);
  36.     list_printf(&list);
  37.    
  38.     return 0;
  39. }


  40. // 初始化順序表

  41. void seqlist_init(SEQLIST *list)
  42. {
  43.     assert(list);   // 斷言:判斷list是否為空
  44.    
  45.     list->array = (int *)malloc(INIT_CAPACITY * sizeof(int)); // 分配一斷內存,容量為 INIT_CAPACITY個int的大小
  46.     assert(list->array);               // 斷言:判斷aray是否為空
  47.     list->size = 0;                    // 沒有賦值之前有效元素個數為0
  48.     list->capacity = INIT_CAPACITY;    // 容量
  49. }


  50. // 判斷順序表是否以滿,如果滿了,增加順序表的容量

  51. void check_capacity(SEQLIST *list)
  52. {
  53.     assert(list);    // 判斷傳入的指針是否為空
  54.    
  55.     if (list->size == list->capacity)
  56.     {
  57.          // 重新分配一塊內存,但是之前的數據不變
  58.         list->array = (int *)realloc(list->array, (2 * list->capacity * sizeof(int)));
  59.         assert(list);            // 判斷是否分配成功
  60.         list->capacity *= 2;     // 容量翻倍
  61.     }
  62. }


  63. // 在順序表前插入數據   
  64. void push_front(SEQLIST *list, int value)
  65. {
  66.     int i;
  67.    
  68.     assert(list);            // 判斷傳入的是否為空
  69.     check_capacity(list);    // 在執行插入之前先判斷順序表是否以滿,如果滿了,增加順序表的容量
  70.    
  71.     // 將所有元素向后移動一位
  72.     for(i=list->size; i>=0; i--)
  73.     {
  74.         list->array[i] = list->array[i-1];
  75.     }
  76.     list->array[0] = value;  // 將插入的值賦給第一個元素
  77.     list->size++;            // 有效元素個數 +1   
  78. }


  79. // 在順序表尾部插入數據   
  80. void push_back(SEQLIST *list, int value)
  81. {
  82.     assert(list);    // 判斷傳入的是否為空
  83.    
  84.     check_capacity(list);  // 在執行插入之前先判斷順序表是否以滿,如果滿了,增加順序表的容量
  85.    
  86.     list->array[list->size] = value; // size記錄了當前有效元素的個數,而數組從0開始,array[list->size]處在順序表最后一個元素的位置+1
  87.     list->size++;           // 插入后,有效元素個數+1
  88. }


  89. // 在順序表第pos個位置插入數據   
  90. void insert_list(SEQLIST *list, int pos, int value)
  91. {
  92.     int i;
  93.    
  94.     assert(list);  // 判斷傳入的指針是否為空
  95.     if (pos > list->size+1 && pos < 0)
  96.     {
  97.         printf("非法操作!!\n");
  98.         return;   
  99.     }
  100.    

  101.     // 將第pos個位置之后的數據往后移動一位
  102.     for (i=list->size; i>=pos; i--)
  103.     {
  104.         list->array[i] = list->array[i-1];   
  105.     }
  106.    
  107.     list->array[pos-1] = value;
  108.     list->size++;
  109. }


  110. // 刪除頭部數據
  111. void pop_front(SEQLIST *list)
  112. {
  113.     int i = 0;
  114.    
  115.     assert(list);    // 判斷傳入的是否為空
  116.    
  117.     if (list->size == 1)
  118.     {
  119.         list->size = 0;
  120.     }
  121.     else
  122.     {
  123.         for (i=0; i<list->size; i++)
  124.         {
  125.             // 將后面的賦值給前面的,第0個元素的數據就不管了(第0個數據被覆蓋)
  126.             // 第1個元素的數據給第0個數據  第2個元素的數據給第1個數據 ...
  127.             list->array[i] = list->array[i+1];  
  128.         }
  129.     }
  130.     list->size--; // 有效數據的個數減1
  131. }

  132. // 尾部插入
  133. void pop_back(SEQLIST *list)
  134. {
  135.     assert(list);
  136.    
  137.     if (list->size == 0)
  138.     {
  139.         return;   
  140.     }
  141.     else
  142.     {
  143.         list->size--;
  144.     }
  145. }

  146. // 遍歷數組,并打印

  147. void list_printf(SEQLIST *list)
  148. {
  149.     int i;
  150.    
  151.     for (i=0; i<list->size; i++)
  152.     {
  153.         printf("%d  \n", list->array[i]);
  154.     }
  155. }
  156.   // 摧毀順序表
  157. void destroy_list(SEQLIST *list)
  158. {
  159.     free(list->array);
  160.    
  161.     list->size = 0;
  162.     list->capacity = 0;
  163. }

  164. // 清空順序表的數據
  165. void list_cleardata(SEQLIST *list)
  166. {
  167.     list->size = 0;
  168. }
復制代碼





作者: Mr丶朋    時間: 2019-4-2 12:13
厲害厲害,有點意思
作者: wis98    時間: 2019-8-29 11:04
厲害厲害,有點意思
作者: wpppmlah    時間: 2019-8-30 16:24
提高一下自己 ,學習前輩的經驗.謝謝.




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 国产免费一区二区 | 激情欧美日韩一区二区 | 亚洲久久 | 亚洲国产精品视频一区 | 亚洲欧美精品国产一级在线 | 国产伦精品一区二区 | 久久在线免费 | 国产成人免费在线 | 国产伦精品一区二区三区照片91 | a级片网站| 一本一道久久a久久精品综合 | 国产日韩一区二区三免费 | 亚洲自拍偷拍免费视频 | 成人永久免费视频 | 伊人伊人 | 国产精品精品视频一区二区三区 | 看亚洲a级一级毛片 | 在线观看视频中文字幕 | 国产在线精品一区二区三区 | 91视频麻豆 | 亚洲一区中文 | 国产在线精品一区二区 | 神马久久av | 免费黄色在线 | 亚洲激情一区二区三区 | 久久精品99 | 中文字幕成人 | 羞羞网站在线观看 | 亚洲视频在线免费观看 | 国产精品伦一区二区三级视频 | 91精品国产综合久久久久久丝袜 | 欧美黑人狂野猛交老妇 | 午夜精品视频一区 | 欧美日韩久久久久 | 亚洲一一在线 | 久久不卡 | 午夜一区二区三区在线观看 | 天天影视亚洲综合网 | 成人在线精品视频 | 在线成人av | 亚洲精品一区国语对白 |