//链式堆栈.c
#include <stdio.h>
#include <malloc.h>
typedef struct Node
{
DataType data;
struct Node *next;
}LSNode;
//初始化
void StackInitiate(LSNode **head)
{
*head=(LSNode *)malloc(sizeof(LSNode));//申请空间
(*head)->next=NULL;
}
//非空否
int StackNotEmpty(LSNode *head)
{
if(head->next=NULL) return 0;
else return 1;
}
//入栈
void StackPush(LSNode *head,DataType x)
{
LSNode *s;
s=(LSNode *)malloc(sizeof(LSNode));//申请空间
s->data=x;
//新结点插入
s->next=head->next;
head->next=s;
}
//出栈
void StackPop(LSNode *head,DataType *x)
{
LSNode *p,*p1;
p=head->next;
if(p==NULL)
{
printf("堆栈已空,无法出栈!");
return 0;
}
else
{
head->next=p>next;//改变head的指向
*d=p->data;
free(p);//free原本的头元素
return 1;
}
}
//取栈元素
void StackTop(LSNode *head,DataTyep *x)
{
LSNode *p;
p=head->next;
if(p==NULL)
{
printf("堆栈已空,无法出栈!");
return 0;
}
else
{
*x=p->data;
return 1;
}
}
//撤销
void Destroy(LSNode **head)
{
LSNode *p=head,*p1;
while(p!=NULL)
{
p1=p;
p=p->next;
free(p1);
}
#include <stdio.h>
#include <malloc.h>
typedef struct Node
{
DataType data;
struct Node *next;
}LSNode;
//初始化
void StackInitiate(LSNode **head)
{
*head=(LSNode *)malloc(sizeof(LSNode));//申请空间
(*head)->next=NULL;
}
//非空否
int StackNotEmpty(LSNode *head)
{
if(head->next=NULL) return 0;
else return 1;
}
//入栈
void StackPush(LSNode *head,DataType x)
{
LSNode *s;
s=(LSNode *)malloc(sizeof(LSNode));//申请空间
s->data=x;
//新结点插入
s->next=head->next;
head->next=s;
}
//出栈
void StackPop(LSNode *head,DataType *x)
{
LSNode *p,*p1;
p=head->next;
if(p==NULL)
{
printf("堆栈已空,无法出栈!");
return 0;
}
else
{
head->next=p>next;//改变head的指向
*d=p->data;
free(p);//free原本的头元素
return 1;
}
}
//取栈元素
void StackTop(LSNode *head,DataTyep *x)
{
LSNode *p;
p=head->next;
if(p==NULL)
{
printf("堆栈已空,无法出栈!");
return 0;
}
else
{
*x=p->data;
return 1;
}
}
//撤销
void Destroy(LSNode **head)
{
LSNode *p=head,*p1;
while(p!=NULL)
{
p1=p;
p=p->next;
free(p1);
}
}
链式堆栈的关键是运用 **head, head头指针的作用与顺序堆栈的top相同,都是与头元素的坐标相关。需要注意的点在于初始化时,要对*head操作,所以要传入*head的地址值**head,同样,撤销时也需要对*head操作,传入**head。head指向头结点,再指向栈顶元素。