栈(stack)--c实现(使用双链表)

是不是直接贴代码不太好,我竟然不知道说什么。

写这个考虑的问题,或者是纠结的问题是这个头指针怎么处理,也就是栈的顶部,最后采用的是初始化第一个栈空间浪费掉,栈顶是有元素的。好像应该去学习下画图,没图不太好说。

写数据结构栈的时候发现自己的2个地方需要进一步补习,用的时候心中没谱---指针和内存分配,看来我还是太水,代码里有3个warning没改出来。

  1 #include <stdio.h>
  2 
  3 
  4 typedef struct node
  5 {
  6     int data;
  7     struct node* next;
  8     struct node* pre;
  9 }Node;
 10 
 11 //Stack 一直指向栈顶
 12 typedef Node* Stack;
 13 
 14 void InitStack(Stack* stack);
 15 void DeleteStack(Stack* stack);
 16 int TopStack(Stack*);
 17 void PushStack(Stack* stack, int elem);
 18 int PopStack(Stack *stack);
 19 int IsNull(Stack*);
 20 void PrintStack(Stack *);
 21 
 22 void PrintStack(Stack *stack)
 23 {
 24     Node* preNode = *stack;
 25     while((preNode->pre != NULL)
 26           &&preNode)
 27     {
 28         printf("%d", preNode->data);
 29         preNode = preNode->pre;
 30         if(preNode->pre != NULL){
 31             printf("<==");
 32         }
 33     }
 34     printf("\n");
 35 
 36 }
 37 //1 means NULL
 38 //stack-->node-->datamem
 39 //这个地方第一次写传的是Stack stack,为什么报错?因为穿的是值,就是一个copy,pre不能确定一定是NULL
 40 int IsNull(Stack *stack)
 41 {
 42      return ((*stack)->pre == NULL);
 43 }
 44 
 45 int PopStack(Stack *stack)
 46 {
 47     if(IsNull(stack))
 48     {
 49         printf("empty stack.\n");
 50         return -1;
 51     }
 52     int popData = -1;
 53     popData = (*stack)->data;
 54     Node* popNode = NULL ;
 55     popNode = *stack;
 56     *stack = (*stack)->pre;
 57     (*stack)->pre = popNode->pre->pre;
 58     (*stack)->next = NULL;
 59 
 60     popNode->pre->pre->next = (*stack);
 61 
 62     free(popNode);//warning
 63 
 64     return popData;
 65 }
 66 void InitStack(Stack* stack)
 67 {
 68     (*stack)->next = NULL;
 69     (*stack)->pre = NULL;
 70     (*stack)->data = -1;
 71     return ;
 72 }
 73 
 74 int TopStack(Stack *stack)
 75 {
 76     return (*stack)->data;
 77 }
 78 
 79 void PushStack(Stack *stack, int elem)
 80 {
 81     //Node *pushNode = (Node*)malloc(sizeof(Node));
 82     Node *pushNode = (Node*) malloc(sizeof(Node));//warning
 83     if(pushNode == NULL)
 84      {
 85          printf("malloc error at line %d.", __LINE__);
 86          return;
 87      }
 88 
 89     pushNode->data = elem;
 90     pushNode->next = NULL;
 91     pushNode->pre = *stack;
 92     (*stack)->next = pushNode;
 93     *stack = (*stack)->next;
 94 
 95 }
 96 
 97 void DeleteStack(Stack* stack)
 98 {
 99 
100     Node* preNode = stack;
101     while((*stack)->pre != NULL)
102     {
103         PopStack(stack);
104 
105     }
106     free(*stack);
107 
108     return ;
109 }
110 
111 
112 int main(void)
113 {
114     printf("Hello World!\n");
115     Stack *stack =NULL;
116     stack = (Stack*)malloc(sizeof(stack));//warning
117     *stack = (Node*)malloc(sizeof(Node));
118     InitStack(stack);
119     IsNull(stack);
120     printf("isNull=[%d]\n", IsNull(stack));
121     printf("the top ele is [%d]\n", (*stack)->data);
122     printf("push elem  1, 2, 3, 4, 3\n");
123     PushStack(stack, 1);
124     PrintStack(stack);
125     PushStack(stack, 2);
126     PushStack(stack, 3);
127     PushStack(stack, 4);
128     PushStack(stack, 3);
129     printf("print the curr stack.\n");
130     PrintStack(stack);
131     printf("Pop the stack and print the curr stack.\n");
132     PopStack(stack);
133     PrintStack(stack);
134 
135     printf("the top elem is %d\n", TopStack(stack));
136 
137 
138     return 0;
139 }

是不是也把运行结果贴上去??

QT运行的,懒得去开虚拟机在linux跑,太费事,还要改MAKEFILE.

运行结果:/*******************begin

Hello World!
isNull=[1]
the top ele is [-1]
push elem  1, 2, 3, 4, 3
1
print the curr stack.
3<==4<==3<==2<==1
Pop the stack and print the curr stack.
4<==3<==2<==1
the top elem is 4

 

 

************end*******/

下一篇写队列吧,想了下定义头尾指针好像会好用点。

posted @ 2016-07-27 23:49  ashen~  阅读(514)  评论(0编辑  收藏  举报