栈的链式结构,不需要考虑栈满的问题,但是不能依赖于top指针(双向链表除外),需要从链表的第一个节点开始遍历,直至找到top所指的节点。
top指针指向的节点一般都有脏数据,因为这个节点只占了内存空间,并没有其他操作。
#include<stdio.h>
#include<malloc.h>
typedef int ElemType;
typedef struct Node{
ElemType data;
struct Node *next;
}Node;
typedef struct
{
Node *top;
Node *base;
int length;
/* data */
}Stack;
void init_stack(Stack *p){
p->base = p->top = (Node *)malloc(sizeof(Node));
p->length = 0;
}
void show(Stack *p){
if(p->top == p->base){
printf("THE STACK IS NULL");
return ;
}
//要把top指针的指向传给一个中间点,通过该点实现遍历
Node *q;
q = p->base;
while(q < p->top){
printf("%2d",q->data);
q = q->next;
}
printf("\n");
}
void push(Stack *p, ElemType e){
Node *q = p->top;
q->data = e;
p->top = (Node *)malloc(sizeof(Node));
q->next = p->top;
p->length++;
}
void pop(Stack *p, ElemType *e){
if(p->top == p->base){
printf("THE STACK IS NULL");
return ;
}
int i = 1;
Node * q = p->base;
while(i < p->length-1){
q = q->next;
i++;
}
Node *del = q->next;
*e = del->data;
q->next = del->next;
free(del);
p->length--;
}
int main(){
ElemType m;
Stack stack;
init_stack(&stack);
push(&stack,2);
push(&stack,4);
show(&stack);
pop(&stack,&m);
show(&stack);
printf("%d\n",m);
return 0;
}