听黑马程序员教程《基础数据结构和算法 (C版本)》,
照着老师所讲抄的,
视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1
喜欢的朋友可以去看看,欢迎大家一起交流学习。
1 #ifndef LINKSTACK_H 2 #define LINKSTACK_H 3 4 #include <stdio.h> 5 #include <stdlib.h> 6 7 8 // 链式栈的节点 9 typedef struct LINKNODE{ 10 struct LINKNODE* next; 11 }LinkNode; 12 13 // 链式栈 14 15 typedef struct LINKSTACK{ 16 LinkNode HeadNode; //头节点 17 int size; 18 }LinkStack; 19 20 // 初始化 21 LinkStack* Init_LinkStack(); 22 // 入栈 23 void Push_LinkStack(LinkStack* stack,LinkNode* data); 24 // 出栈 (删除第一个元素) 25 void Pop_LinkStack(LinkStack* stack); 26 // 返回栈顶元素 27 LinkNode* Top_LinkStack(LinkStack* stack); 28 // 返回栈元素的个数 29 int Size_LinkStack(LinkStack* stack); 30 // 清空栈 31 void Clear_LinkStack(LinkStack* stack); 32 // 销毁栈 33 void FreeSpace_LinkStack(LinkStack* stack); 34 35 36 37 #endif
1 #include "LinkStack.h" 2 3 4 // 初始化 5 LinkStack* Init_LinkStack(){ 6 7 // 开内存 8 LinkStack* stack = (LinkStack*)malloc(sizeof(LinkStack)); 9 // 初始化 10 stack->HeadNode.next = NULL; 11 stack->size = 0; 12 13 return stack; 14 } 15 16 // 入栈 17 void Push_LinkStack(LinkStack* stack,LinkNode* data){ 18 19 if(stack == NULL){ 20 return; 21 } 22 if(data == NULL){ 23 return; 24 } 25 26 data->next = stack->HeadNode.next; 27 stack->HeadNode.next = data; 28 29 stack->size++; 30 31 } 32 33 // 出栈 (删除第一个元素) 34 void Pop_LinkStack(LinkStack* stack){ 35 36 if(stack == NULL){ 37 return ; 38 } 39 if(stack->size==0){ 40 return ; 41 } 42 43 // 第一个有效节点 44 LinkNode* pNext = stack->HeadNode.next; 45 stack->HeadNode.next = pNext->next; // pNext.next为第一个有效节点的下一个节点 46 47 stack->size--; 48 49 } 50 51 // 返回栈顶元素 52 LinkNode* Top_LinkStack(LinkStack* stack){ 53 54 if(stack == NULL){ 55 return NULL; 56 } 57 if(stack->size==0){ 58 return NULL; 59 } 60 61 return stack->HeadNode.next; 62 } 63 64 // 返回栈元素的个数 65 int Size_LinkStack(LinkStack* stack){ 66 if(stack == NULL){ 67 return -1; 68 } 69 return stack->size; 70 } 71 72 // 清空栈 73 void Clear_LinkStack(LinkStack* stack){ 74 75 if(stack == NULL){ 76 return; 77 } 78 stack->HeadNode.next = NULL; 79 stack->size=0; 80 81 } 82 83 // 销毁栈 84 void FreeSpace_LinkStack(LinkStack* stack){ 85 86 if(stack == NULL){ 87 return; 88 } 89 90 free(stack); 91 92 93 }
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 #include "LinkStack.c" 6 7 // 栈数据(用户数据) 8 typedef struct PERSON{ 9 LinkNode node; 10 char name[32]; 11 int age; 12 }Person; 13 14 15 int main(){ 16 printf("好好学习,天天向上~!!!\t\t\t 06 栈的链式存储20220611\n\n"); 17 18 // 初始化 19 LinkStack* stack = Init_LinkStack(); 20 21 // 创建用户数据 22 Person p1,p2,p3,p4,p5; 23 strcpy(p1.name,"aaa"); 24 strcpy(p2.name,"bbb"); 25 strcpy(p3.name,"ccc"); 26 strcpy(p4.name,"ddd"); 27 strcpy(p5.name,"eee"); 28 p1.age=18; 29 p2.age=19; 30 p3.age=20; 31 p4.age=21; 32 p5.age=22; 33 34 35 // 入栈 36 Push_LinkStack(stack,(LinkNode*)&p1); 37 Push_LinkStack(stack,(LinkNode*)&p2); 38 Push_LinkStack(stack,(LinkNode*)&p3); 39 Push_LinkStack(stack,(LinkNode*)&p4); 40 Push_LinkStack(stack,(LinkNode*)&p5); 41 42 43 44 // 输出 45 while(Size_LinkStack(stack)>0){ 46 // 取出栈顶元素 47 Person* p = (Person*)Top_LinkStack(stack); 48 printf("姓名:%s\t年龄:%d\n",p->name,p->age); 49 50 // 出栈(删除栈顶元素,也就是删除链的第一个元素) 51 Pop_LinkStack(stack); 52 } 53 54 55 56 // 销毁栈 57 FreeSpace_LinkStack(stack); 58 59 60 printf("\n\n"); 61 system("pause"); 62 63 return 0; 64 }