1 #include<stdio.h>
2 //定义结构体
3 typedef struct{
4 int data;
5 struct Stack_chain * next;
6 }*Stack_chain,Stack;
7
8 typedef struct index{
9 //存储栈的地址
10 Stack_chain top;
11 //栈的数组下标,初始化为-1
12 int index;
13 };
14 //初始化栈,二级指针改变实参的地址
15 void init_stack(struct index **s){
16 *s = (struct index*)malloc(sizeof(struct index));
17 (*s)->index = -1;
18 (*&(*s))->top = NULL;
19 };
20 //进栈
21 Stack_chain push(Stack_chain s,int data,struct index *i){
22 s = (Stack_chain)malloc(sizeof(Stack));
23 Stack_chain head;
24 head = (Stack_chain)malloc(sizeof(Stack));
25 s->data = data;
26 s->next = NULL;
27 //判断是否第一次入栈
28 if(i->index == -1)
29 {
30 //将栈底也就是数组下标为0的地址保存下来
31 head = s;
32 }
33 else{
34 //将新分配的地址赋值给上一个结构体指针的next指针
35 i->top->next = s;
36 }
37 //数组下标加1
38 i->index++;
39 //保存此次分配的内存地址
40 i->top = s;
41 return head;
42 };
43 //出栈
44 void pop(Stack_chain chain,struct index *i){
45 while(i->index != -1)
46 {
47 printf("address=%d,data=%d,next_address=%d\n",chain,chain->data,chain->next);
48 //释放内存空间
49 free(chain);
50 chain = chain->next;
51 i->index--;
52 }
53 };
54
55 void main()
56 {
57 int data,a;
58 Stack_chain chain,head;
59 head = (Stack_chain)malloc(sizeof(Stack));
60 struct index *id;
61 data = 1;
62 init_stack(&id);
63 //printf("%d,%d,%d\n",id,id->index,id->top);
64 printf("input data:\n");
65 while(data != -1){
66 scanf("%d",&data);
67 if(id->index == -1){head = push(chain,data,id);}
68 else
69 {push(chain,data,id);}
70 printf("%d,%d,%d,head=%d\n",id,id->index,id->top,head);
71 }
72
73 printf("Print data:\n");
74 pop(head,id);
75 free(head);
76 free(id);
77 id = NULL;
78 head = NULL;
79 chain = NULL;
80 }