|
最近在學(xué)習(xí)stm32的時候發(fā)現(xiàn)自己的c語言基礎(chǔ)還停留在c51的水平,因此做一些練習(xí)提高自己的c語言水平。
我參考了 《妙趣橫生的算法-c語言實現(xiàn)》這本書,建議大家從書 店入手
- #include <stdio.h>
- #include <mallco.h> // 使用malloc函數(shù)要包含這個文件
- #include <assert.h>
- #define INIT_CAPACITY 10 // 初始化時分配的容量
- typedef struct seqlist{
- int *array; // 存儲空間的基地址
- int size; // 有效元素個數(shù)
- int capacity; // 當(dāng)前分配的存儲容量
- }SEQLIST;
- void seqlist_init(SEQLIST *list); //初始化順序表
- void check_capacity(SEQLIST *list); // 檢查是否滿
- void push_front(SEQLIST *list, int value); // 在順序表前頭部插入元素
- void push_back(SEQLIST *list, int value); // 在順序表尾部插入元素
- void insert_list(SEQLIST *list, int pos, int value); // 在pos這個位置插入元素
- void pop_front(SEQLIST *list); // 刪除順序表第一個元素
- void pop_back(SEQLIST *list); // 刪除順序表最后一個元素
- void list_printf(SEQLIST *list); // 遍歷順序表
- void destroy_list(SEQLIST *list); // 摧毀順序表
- void list_cleardata(SEQLIST *list); // 清空順序表的數(shù)據(jù)
- int main(void)
- {
- SEQLIST list;
-
- seqlist_init(&list);
- push_front(&list, 3);
- push_front(&list, 2);
- push_front(&list, 1);
- // list_printf(&list);
-
- push_back(&list, 3);
- push_back(&list, 2);
- push_back(&list, 1);
- pop_back(&list);
- pop_front(&list);
- insert_list(&list, 3, 4);
- list_printf(&list);
-
- return 0;
- }
- // 初始化順序表
- void seqlist_init(SEQLIST *list)
- {
- assert(list); // 斷言:判斷l(xiāng)ist是否為空
-
- list->array = (int *)malloc(INIT_CAPACITY * sizeof(int)); // 分配一斷內(nèi)存,容量為 INIT_CAPACITY個int的大小
- assert(list->array); // 斷言:判斷aray是否為空
- list->size = 0; // 沒有賦值之前有效元素個數(shù)為0
- list->capacity = INIT_CAPACITY; // 容量
- }
- // 判斷順序表是否以滿,如果滿了,增加順序表的容量
- void check_capacity(SEQLIST *list)
- {
- assert(list); // 判斷傳入的指針是否為空
-
- if (list->size == list->capacity)
- {
- // 重新分配一塊內(nèi)存,但是之前的數(shù)據(jù)不變
- list->array = (int *)realloc(list->array, (2 * list->capacity * sizeof(int)));
- assert(list); // 判斷是否分配成功
- list->capacity *= 2; // 容量翻倍
- }
- }
- // 在順序表前插入數(shù)據(jù)
- void push_front(SEQLIST *list, int value)
- {
- int i;
-
- assert(list); // 判斷傳入的是否為空
- check_capacity(list); // 在執(zhí)行插入之前先判斷順序表是否以滿,如果滿了,增加順序表的容量
-
- // 將所有元素向后移動一位
- for(i=list->size; i>=0; i--)
- {
- list->array[i] = list->array[i-1];
- }
- list->array[0] = value; // 將插入的值賦給第一個元素
- list->size++; // 有效元素個數(shù) +1
- }
- // 在順序表尾部插入數(shù)據(jù)
- void push_back(SEQLIST *list, int value)
- {
- assert(list); // 判斷傳入的是否為空
-
- check_capacity(list); // 在執(zhí)行插入之前先判斷順序表是否以滿,如果滿了,增加順序表的容量
-
- list->array[list->size] = value; // size記錄了當(dāng)前有效元素的個數(shù),而數(shù)組從0開始,array[list->size]處在順序表最后一個元素的位置+1
- list->size++; // 插入后,有效元素個數(shù)+1
- }
- // 在順序表第pos個位置插入數(shù)據(jù)
- void insert_list(SEQLIST *list, int pos, int value)
- {
- int i;
-
- assert(list); // 判斷傳入的指針是否為空
- if (pos > list->size+1 && pos < 0)
- {
- printf("非法操作!!\n");
- return;
- }
-
- // 將第pos個位置之后的數(shù)據(jù)往后移動一位
- for (i=list->size; i>=pos; i--)
- {
- list->array[i] = list->array[i-1];
- }
-
- list->array[pos-1] = value;
- list->size++;
- }
- // 刪除頭部數(shù)據(jù)
- void pop_front(SEQLIST *list)
- {
- int i = 0;
-
- assert(list); // 判斷傳入的是否為空
-
- if (list->size == 1)
- {
- list->size = 0;
- }
- else
- {
- for (i=0; i<list->size; i++)
- {
- // 將后面的賦值給前面的,第0個元素的數(shù)據(jù)就不管了(第0個數(shù)據(jù)被覆蓋)
- // 第1個元素的數(shù)據(jù)給第0個數(shù)據(jù) 第2個元素的數(shù)據(jù)給第1個數(shù)據(jù) ...
- list->array[i] = list->array[i+1];
- }
- }
- list->size--; // 有效數(shù)據(jù)的個數(shù)減1
- }
- // 尾部插入
- void pop_back(SEQLIST *list)
- {
- assert(list);
-
- if (list->size == 0)
- {
- return;
- }
- else
- {
- list->size--;
- }
- }
- // 遍歷數(shù)組,并打印
- void list_printf(SEQLIST *list)
- {
- int i;
-
- for (i=0; i<list->size; i++)
- {
- printf("%d \n", list->array[i]);
- }
- }
- // 摧毀順序表
- void destroy_list(SEQLIST *list)
- {
- free(list->array);
-
- list->size = 0;
- list->capacity = 0;
- }
- // 清空順序表的數(shù)據(jù)
- void list_cleardata(SEQLIST *list)
- {
- list->size = 0;
- }
復(fù)制代碼
|
評分
-
查看全部評分
|