C语言

单链表: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
linkList.h
 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 }
linkList.c

栈: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
stack.h
 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 }
stack.c
原文地址:https://www.cnblogs.com/develon/p/7740050.html