5-1動態記憶體分配,分配的是堆記憶體的空間 分配記憶體函數 (都集中在庫函數 stdlib.h 中) 在使用動態分配之前,首先要判斷是否分配成功。 記憶體的釋放函數原型: 記憶體釋放後建議把指針指向NULL 5-2隊列(初始化,入隊,出隊,判斷空,判斷滿) 單向隊列 迴圈隊列 (隊頭和隊尾有兩種情況會指向同 ...
5-1動態記憶體分配,分配的是堆記憶體的空間
- 分配記憶體函數 (都集中在庫函數 stdlib.h 中)
void *malloc (unsigned int num_bytes); //指定分配記憶體空間大小,大小為 num_bytes位元組,其值是隨機值。 void *calloc (unsigned num ,unsigned size); //參數包含元素的數量和每個元素的位元組數,記憶體空間為num*sie void *realloc(void *ptr,size_t size); //調用該函數對記憶體空間進行重新分配,ptr指向已有的記憶體空間,size用來指定重新分配後所得整個空間大小
在使用動態分配之前,首先要判斷是否分配成功。
- 記憶體的釋放函數原型:
void free(void *ptr); //動態分配的記憶體使用結束後,要及時釋放,
記憶體釋放後建議把指針指向NULL
5-2隊列(初始化,入隊,出隊,判斷空,判斷滿)
- 單向隊列
- 迴圈隊列 (隊頭和隊尾有兩種情況會指向同一位置,一是隊列空了,二是隊列滿了)
#define QueueSize_UartLen 8 typedef struct { int front; //隊頭 int rear; //隊尾 int counter; //記錄隊列元素的個數 int uart_data[QueneSize_UartLen]; //定義數組用來存儲隊列的元素 }CIRQUEUE_UART; //定義結構體,用typedef把結構體重新命名為CIRQUEUE_UART void InitQueue(CIRQUEUE_UART *queue) //初始化形參,CIRQUEUE_UART類型的指針變數queue,隊列的初始化 { queue->front=0; //->與指向結構體變數的指針相連,表示指向結構體變數指針的成員(左邊為指針,註意與 . 的區別) queue->rear=0; queue->counter=0; } int Inqueue(CIRQUEUE_UART *queue,int data) //入隊 { if(QueueFull(queue)) //隊滿判斷 { return 0; //輸出隊滿提示 } else { queue->uart_data[queue->rear]=data; //queue->rear指向隊尾待插入數據位置 queue->counter++; //計數器加1 queue->rear=(queue->rear+1)%QueueSize_UartLen; //然後指queue->rear向下一個待插入數據的位置 return 1; } } int OutQueue(CIRQUEUE_UART *queue,int *p_data) //出隊 通過指針p_data取出隊的數據 { if(QueueEmpty(queue)) { return 0; } else { *p_data=queue->data(front); //先把出隊的數據元素取出放在p_data queue->counter--; //計數器減1 queue->front=(queue->front+1)%QueueSize_UartLen; //然後指queue->front向下一個位置 return 1; } } int QueueEmpty(CIRQUEUE_UART *queue) //判斷隊空 { return queue->count==0; } int QueueFull(CIRQUEUE_UART *queue) //判斷隊滿 { return queue->counter==QueueSize_UartLen; }
- 鏈式隊列
typedef struct LinkNode_t { int data; struct LinkNode_t *next; }LinkNode; typedef struct LinkPoint_t { struct LinkNode_t *front; struct LinkNode_t *rear; }LinkQueue; LinkQueue *queue; LinkNode *node; LinkQueue LinkQueueInit() //初始化 { queue_t=(LinkQueue)malloc(sizeof(LinkQueue)); node=(LinkQueue)malloc(sizeof(LinkNode)); node->front=queue->rear->next; queue_t->front=queue->rear->node; return queue_t; } void InlinkQueue(LinkQueue *queue,int data) //進隊 { node=(LinkNode)malloc(sizeof(LinkNode)); node->data=data; node->next=queue->rear->next; queue->rear->next=node; queue->rear=node; } void OutQueue(LinkQueue *queue) //出隊 { int data; if(!LQEmpty(queue)) { node=queue->front->next; queue->front->next=node->next; data=node->data; if(node==queue->rear) { queue->rear=queue->front; } free(node); return data; } } int LQEmpty(LinkQueue *queue) //對空判斷 { if(queue->front==queue->rear) { return 1; } else { return 0; } }
5-3堆棧(初始化,進棧,出棧,棧空的判斷,棧滿的判斷,取棧頂元素)
5-4鏈表(鏈表建立,鏈表初始化,鏈表插入,鏈表刪除)
5-5樹
(未完,待續......)