编程语言
首页 > 编程语言> > C语言- 基础数据结构和算法 - 栈的链式存储

C语言- 基础数据结构和算法 - 栈的链式存储

作者:互联网

听黑马程序员教程《基础数据结构和算法 (C版本)》,

照着老师所讲抄的,

视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1

喜欢的朋友可以去看看,欢迎大家一起交流学习。

LinkStack.h

 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

LinkStack.c

 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 }

06 栈的链式存储20220611_main.c

 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 }

 

标签:LinkStack,NULL,return,C语言,next,链式,数据结构,LinkNode,stack
来源: https://www.cnblogs.com/stou/p/16365815.html