第十七章:经典抽象数据类型
-
堆栈实现
/*接口声明 stack.h*/ #define STACK_TYPE int void push(STACK_TYPE value); void pop( void ); STACK_TYPE top(void ); STACK_TYPE top( void ); int is_empty( void ); int is_full( void ); /*静态数组实现 stack.c*/ #include "stack.h" #include <assert.h> #define STACK_SIZE 100 static STACK_TYPE stack[STACK_SIZE]; static int top_element = -1; void push(STACK_TYPE value) { assert( is_full() ); top_element += 1; stack[top_element] = value; } void pop() { assert( is_empty()); top_element -= 1; } STACK_TYPE top(void) { assert(is_empty()); return stack[top_element]; } int is_empty() { return top_element == -1; } int is_full() { return top_element == STACK_SIZE - 1; } /*动态数组实现 stack.c*/ #include "stack.h" #include <assert.h> #include <stdio.h> #include <stdlib.h> #include <malloc.h> static STACK_TYPE *stack; static size_t stack_size; static int top_element = -1; void create_stack(size_t size) { assert(stack_size = 0); stack_size = size; stack = malloc(stack_size * sizeof(STACK_TYPE)); assert(stack != NULL); } void destory_stack(void) { assert(stack_size>0); stack_size = 0; free(stack); stack = NULL; } void push(STACK_TYPE value) { assert( is_full() ); top_element += 1; stack[top_element] = value; } STACK_TYPE top(void) { assert(is_empty()); return stack[top_element]; } void pop() { assert( is_empty()); top_element -= 1; } int is_empty() { return top_element == -1; } int is_full() { return top_element == STACK_SIZE - 1; } /*链表实现 stack.c*/ #include "stack.h" #include <assert.h> #include <stdio.h> #include <stdlib.h> #include <malloc.h> #define FALSE 0 typedef struct STACK_NODE { struct STACK_NODE *next; STACK_TYPE value; } StackNode; /*链头*/ static StackNode *stack; void create_stack(size_t size) {} void destory_stack(void ) { while (is_empty()) pop(); } void push(STACK_TYPE value) { StackNode *new_node; new_node = malloc(sizeof(StackNode)); new_node->value = value; new_node->next = stack; stack = new_node; } void pop(void) { StackNode *first_node; assert(!is_empty()); first_node = stack; stack = first_node->next; free(first_node); } STACK_TYPE top(void) { assert(!is_empty()); return stack->value; } int is_empty(void) { return stack == NULL; } /*链表默认永远不满*/ int is_full(void) { return FALSE; }
-
队列实现
/*队列接口 queue.h*/ #include <stdlib.h #define QUEUE_TYPE int void create_queue(size_t size); void destroy_queue(void); void insert(QUEUE_TYPE value); void delete(void); QUEUE_TYPE first(void); int is_empty(void ); int is_full(void ); /*使用不完全数组技巧,静态数组实现队列*/ #include "queue.h" #include <stdio.h> #include <assert.h> #define QUEUE_SIZE 100 #define ARRAY_SIZE (QUEUE_SIZE + 1) static QUEUE_TYPE queue[ARRAY_SIZE]; static size_t front = 1; static size_t rear = 0; void insert(QUEUE_TYPE value) { assert( ! is_full() ); rear = (rear + 1) % ARRAY_SIZE; queue[rear] = value; } void delete(void) { assert( !is_empty() ); front = (front + 1) % ARRAY_SIZE; } QUEUE_TYPE first(void) { assert( !is_empty() ); return queue[front]; } int is_empty(void ) { return (rear + 1) % ARRAY_SIZE == front; } int is_full(void ) { return (rear + 2) % ARRAY_SIZE == front; }
-
二叉树实现
/*二叉树接口 tree.h*/ #define TREE_TYPE int void insert(TREE_TYPE value); TREE_TYPE *find(TREE_TYPE value); /*参数为回调函数指针*/ void pre_order_traverse(void (*callback)(TREE_TYPE value)); void mid_order_traverse(void (*callback)(TREE_TYPE value)); void back_order_traverse(void (*callback)(TREE_TYPE value)); /*静态数组实现 tree.c*/ #include "tree.h" #include <assert.h> #include <stdio.h> #define TREE_SIZE 100 #define ARRAY_SIZE (TREE_SIZE + 1) static TREE_TYPE tree[ARRAY_SIZE]; static int left_child( int current) { return current * 2; } static int right_child(int current) { return current * 2+1; } void insert(TREE_TYPE value) { int current; assert(value != 0); current = 1; while (tree[current] != 0) { if (value < tree[current]) current = left_child(current); else { assert(value != tree[current]); current = right_child(current); } assert(current < ARRAY_SIZE); } tree[current] = value; } TREE_TYPE *find(TREE_TYPE value) { int current; current = 1; while (current < ARRAY_SIZE && tree[current] != value) { if (value < tree[current]) current = left_child(current); else current = right_child(current); } if(current < ARRAY_SIZE) return tree + current; else return 0; } /*递归实现前序遍历*/ static void do_pre_order_traverse(int current, void (*callback)(TREE_TYPE value)) { if (current < ARRAY_SIZE && tree[current] != 0) { callback(tree[current]); do_pre_order_traverse(left_child(current),callback); do_pre_order_traverse(right_child(current),callback); } } void pre_order_traverse(void (*callback)(TREE_TYPE value)) { do_pre_order_traverse(1,callback); } /*递归实现中序遍历*/ static void do_mid_order_traverse(int current, void (*callback)(TREE_TYPE value)) { if (current < ARRAY_SIZE && tree[current] != 0) { do_mid_order_traverse(left_child(current),callback); callback(tree[current]); do_mid_order_traverse(right_child(current),callback); } } void mid_order_traverse(void (*callback)(TREE_TYPE value)) { do_mid_order_traverse(1,callback); } /*递归实现后序遍历*/ static void do_last_order_traverse(int current, void (*callback)(TREE_TYPE value)) { if (current < ARRAY_SIZE && tree[current] != 0) { do_last_order_traverse(left_child(current),callback); do_last_order_traverse(right_child(current),callback); callback(tree[current]); } } void last_order_traverse(void (*callback)(TREE_TYPE value)) { do_last_order_traverse(1,callback); } /*链表实现二叉树*/ #include "tree.h" #include <assert.h> #include <stdio.h> #include <malloc.h> typedef struct TREE_NODE { TREE_TYPE value; struct TREE_NODE *left; struct TREE_NODE *right; } Tree_Node; static Tree_Node *tree; void insert( TREE_TYPE value) { Tree_Node *current; Tree_Node **link; link = &tree; while ((current = *link) != NULL) { if ( value < current->value) link = ¤t->left; else { assert(value != current->value); link = ¤t->right; } } current = malloc(sizeof(TREE_NODE)); assert(current != NULL); current->value = value; current->left = NULL; current->right = NULL; *link = current; } TREE_TYPE * find(TREE_TYPE value) { Tree_Node *current; current = tree; while (current != NULL && current->value != value) { if(value < current->value) current = current->left; else current = current->right } if (current != NULL) return ¤t->value; else return NULL; } void do_pre_order_traverse(Tree_Node *current, void (*callback)(TREE_TYPE value)) { if(current != NULL) { callback(current->value); do_pre_order_traverse(current->left,callback); do_pre_order_traverse(current->right,callback); } } void pre_order_traverse(void (*callback)(TREE_TYPE value)) { do_pre_order_traverse(tree,callback); }