欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3069|回復: 3
收起左側

C語言動態順序表源程序

[復制鏈接]
ID:170498 發表于 2019-4-1 17:42 | 顯示全部樓層 |閱讀模式
最近在學習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. }
復制代碼




評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:430197 發表于 2019-4-2 12:13 | 顯示全部樓層
厲害厲害,有點意思
回復

使用道具 舉報

ID:33544 發表于 2019-8-29 11:04 | 顯示全部樓層
厲害厲害,有點意思
回復

使用道具 舉報

ID:68189 發表于 2019-8-30 16:24 | 顯示全部樓層
提高一下自己 ,學習前輩的經驗.謝謝.
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表