单链表:linkList.h linkList.c
1 #ifndef LINKLIST_H_INCLUDE 2 #define LINKLIST_H_INCLUDE 3 #include <Windows.h> 4 5 //什么是链表 是一种动态数组 管理一堆不断变化的元素 6 7 typedef struct e{ 8 void *data;//元素通过一个万能的指针指向代表的数据 9 struct e *next;//指向下一个元素 10 }E, *PE; 11 12 //单链表 对象属性:一个元素句柄 元素个数 13 typedef struct linkList{ 14 PE handler;//元素的句柄 15 int count;//元素的总数 16 }LinkList, *PLinkList; 17 18 //以下是接口 19 20 //实例化一个元素 最常用的构造方法:直接指定数据 21 PE newE(void *); 22 //实例化一个空链表 23 PLinkList newLinkList(); 24 //查 25 PE LinkList_get(PLinkList, int); 26 //删 27 BOOL LinkList_del(PLinkList, int); 28 //改 29 BOOL LinkList_set(PLinkList, int, PE); 30 //增 31 BOOL LinkList_add(PLinkList, int, PE); 32 //叛空 33 BOOL LinikList_isEmpty(PLinkList); 34 //取数量 35 int LinkList_getCount(PLinkList); 36 37 #endif
1 #include "linkList.h" 2 #include <stdlib.h> 3 #include <assert.h> 4 5 //实例化一个元素 最常用的构造方法:直接指定数据 6 PE newE(void *data){ 7 PE r = NULL; 8 r = (PE) malloc(sizeof(E)); 9 r->data = data; 10 r->next = NULL; 11 return r; 12 } 13 //实例化一个空链表 14 PLinkList newLinkList(){ 15 PLinkList r = NULL; 16 r = (PLinkList) malloc(sizeof(LinkList)); 17 r->count = 0; 18 r->handler = newE(NULL); 19 return r; 20 } 21 //查 22 PE LinkList_get(PLinkList list, int id){//id:[0,n] 23 int i = 0; 24 PE e = NULL; 25 assert(list!=NULL); 26 assert(id>=0&&id<=list->count); 27 e = list->handler; 28 for(i=1;i<=id;i++){ 29 e = e->next; 30 } 31 return e; 32 } 33 //删 34 BOOL LinkList_del(PLinkList list, int id){//id[1,n] 35 //assert(list); 36 //assert(id>=1&&id<=list->count); 37 if(!list|| id<1|| id>list->count) return FALSE; 38 //id-1->next=id->next 39 LinkList_get(list, id-1)->next = LinkList_get(list, id)->next; 40 list->count--; 41 return TRUE; 42 } 43 //改 44 BOOL LinkList_set(PLinkList list, int id, PE e){//id:[1,n] 45 if(!list|| !e|| id<1|| id>list->count) return FALSE; 46 e->next = LinkList_get(list, id)->next; 47 LinkList_get(list, id-1)->next = e; 48 return TRUE; 49 } 50 //增 51 BOOL LinkList_add(PLinkList list, int id, PE e){//id:[1,n+1]=>[1,~) 52 assert(list&&e); 53 if(id>list->count+1) 54 id = list->count+1; 55 assert(id>=1&&id<=list->count+1); 56 //e连接id-1->next,id-1连接e 57 e->next = LinkList_get(list, id-1)->next; 58 LinkList_get(list, id-1)->next = e; 59 list->count++; 60 return TRUE; 61 } 62 //叛空 63 BOOL LinikList_isEmpty(PLinkList list){ 64 assert(list); 65 if(list->count==0) 66 return TRUE; 67 return FALSE; 68 } 69 //取数量 70 int LinkList_getCount(PLinkList list){ 71 assert(list); 72 return list->count; 73 }
栈:stack.h stack.c
1 #ifndef STACK_H_INCLUDE 2 #define STACK_H_INCLUDE 3 #include <Windows.h> 4 #include "linkList.h" 5 /** 6 *对象:栈 7 *属性:链表指针 栈帧 8 *接口:实例化 入栈 弹栈 取栈顶元素 叛空 取元素数量 9 */ 10 typedef struct stack{ 11 PLinkList list;//链表 12 int top;//栈顶 13 }Stack, *PStack; 14 15 //以下为接口 16 17 PStack newStack();//实例化一个空栈 18 BOOL Stack_push(PStack, void*);//入栈 19 void *Stack_pop(PStack);//弹栈 20 void *Stack_getTop(PStack);//取栈顶元素但不弹出 相当于将该元素弹栈使用后又入栈 21 BOOL Stack_isEmpty(PStack);//叛空 22 int Stack_getCount(PStack);//取栈剩余元素数量 23 24 25 #endif
1 #include "stack.h" 2 #include "linkList.h" 3 #include <assert.h> 4 #include <stdlib.h> 5 6 //实例化一个空栈 7 PStack newStack(){ 8 PStack r = NULL; 9 r = (PStack) malloc(sizeof(Stack)); 10 r->top = 0; 11 r->list = newLinkList(); 12 return r; 13 } 14 //入栈 15 BOOL Stack_push(PStack stack, void* data){ 16 assert(stack); 17 //创建一个新元素, 添加到表头(方便弹栈) 18 if(LinkList_add(stack->list, 1, newE(data)) ){ 19 stack->top++; 20 return TRUE; 21 } 22 return FALSE; 23 } 24 //弹栈 25 void *Stack_pop(PStack stack){ 26 assert(stack); 27 if(stack->top>0&&stack->list->count>0){ 28 PE e = LinkList_get(stack->list, 1); 29 if(e){ 30 stack->top--;; 31 LinkList_del(stack->list, 1); 32 return e->data; 33 } 34 } 35 return NULL; 36 } 37 void *Stack_getTop(PStack stack){ 38 PE e = NULL; 39 assert(stack); 40 if(stack->top> 0 && stack->list->count> 0 ){ 41 e = LinkList_get(stack->list, 1); 42 } 43 return e? e->data: NULL; 44 } 45 //叛空 46 BOOL Stack_isEmpty(PStack stack){ 47 return !stack->top; 48 } 49 //取栈剩余元素数量 50 int Stack_getCount(PStack stack){ 51 assert(stack); 52 return stack->top; 53 }