
作業社區
探索學習新天地,共享知識資源!
RX0_UNICORN 的學生作業:
鏈式棧練習 // linkstack.h #ifndef __LINKSTACK_H__ #define __LINKSTACK_H__ #include #include #include typedef char data_t; typedef struct node { data_t data; struct node *next; }linknode_t; typedef struct { linknode_t *top; // 棧頂指針 int n; // 棧中元素個數 }linkstack_t; extern linkstack_t *create_empty_linkstack(); extern int is_empty_linkstack(linkstack_t *sl); extern int push_linkstack(linkstack_t *sl, data_t data); extern data_t pop_linkstack(linkstack_t *sl); extern data_t get_top_data(linkstack_t *sl); #endif // linkstack.c #include "linkstack.h" // 創建空的棧頂 linkstack_t *create_empty_linkstack() { linkstack_t *sl = NULL; sl = (linkstack_t *)malloc(sizeof(linkstack_t)); if(NULL == sl) { printf("malloc is fail!\n"); return NULL; } memset(sl, 0, sizeof(linkstack_t)); sl->top = NULL; return sl; } // 判空 int is_empty_linkstack(linkstack_t *sl) { return sl->top == NULL ? 1 : 0; } // 入棧 int push_linkstack(linkstack_t *sl, data_t data) { // 為新節點申請堆區空間,并為 temp->data 賦值 linknode_t *temp = (linknode_t *)malloc(sizeof(linknode_t)); if(NULL == temp) { printf("temp malloc is fail!\n"); return -1; } temp->data = data; // temp->next = sl->top; sl->top = temp; sl->n++; return 0; } // 出棧 data_t pop_linkstack(linkstack_t *sl) { // 保存刪除節點的地址(原棧頂指針) linknode_t *temp = sl->top; // 保存節點數據 data_t data = temp->data; // 更新棧頂指針,--- 即將刪除節點保存的下一個節點的地址 sl->top = temp->next; // 釋放空間 free(temp); temp = NULL; // 更新 n sl->n--; return data; } // 打印棧頂元素 data_t get_top_data(linkstack_t *sl) { return sl->top->data; } // linkstack main.c #include "linkstack.h" int main(int argc, const char *argv[]) { data_t data[] = {'a','n','i','h','c',' ','e','v','o','l',' ','I'}; linkstack_t *sl = create_empty_linkstack(); for (int i = 0; i < sizeof(data)/sizeof(data[0]); i++) { push_linkstack(sl, data[i]); } // data_t top_d = get_top_data(sl); // printf("%c\n", top_d); while (!is_empty_linkstack(sl)) { data_t ret = pop_linkstack(sl); printf("%c", ret); } printf("\n"); return 0; } 鏈式隊列練習 // linkqueue.h #ifndef __LINKQUEUE_H__ #define __LINKQUEUE_H__ #include #include #include typedef char data_t; // 鏈式隊列節點類型 typedef struct node { data_t data; struct node *next; }linknode_t; // 鏈式隊列隊列頭類型 typedef struct { linknode_t *front; linknode_t *rear; }linkqueue_t; extern linkqueue_t *create_empty_linkqueue(); extern int is_empty_linkqueue(linkqueue_t *lq); extern void enter_data_linkqueue(linkqueue_t *lq, data_t data); extern data_t delete_data_linkqueue(linkqueue_t *lq); #endif // linkqueue.c #include "linkqueue.h" linkqueue_t *create_empty_linkqueue() { linkqueue_t *lq = NULL; linknode_t *head = NULL; head = (linknode_t *)malloc(sizeof(linknode_t)); lq = (linkqueue_t *)malloc(sizeof(linkqueue_t)); if(NULL == lq || NULL == head) { printf("malloc is fail!\n"); return NULL; } head->next = NULL; lq->front = lq->rear = head; return lq; } int is_empty_linkqueue(linkqueue_t *lq) { return lq->front == lq->rear ? 1 : 0; } void enter_data_linkqueue(linkqueue_t *lq, data_t data) { linknode_t *temp = NULL; temp = (linknode_t *)malloc(sizeof(linknode_t)); if(NULL == temp) { printf("malloc is fail!\n"); return; } temp->data = data; temp->next = lq->rear->next; lq->rear->next = temp; lq->rear = temp; return; } data_t delete_data_linkqueue(linkqueue_t *lq) { data_t data; linknode_t *temp = NULL; temp = lq->front->next; data = temp->data; lq->front->next = temp->next; free(temp); temp = NULL; if(lq->front->next == NULL) { lq->rear = lq->front; } return data; } // linkqueue main.c #include "linkqueue.h" int main(int argc, const char *argv[]) { char data[] = {'I', ' ', 'L', 'o', 'v', 'e', ' ', 'C', 'h', 'i', 'n', 'a'}; linkqueue_t *lq = create_empty_linkqueue(); for(int i = 0; i < sizeof(data)/sizeof(data[0]); i++) { enter_data_linkqueue(lq, data[i]); } while(!is_empty_linkqueue(lq)) { data_t ret = delete_data_linkqueue(lq); printf("%c", ret); } printf("\n"); return 0; }




