链式堆栈.c

来源:互联网 发布:语音加速器软件 编辑:程序博客网 时间:2024/05/19 05:37
//链式堆栈.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);
}

}

  链式堆栈的关键是运用 **head, head头指针的作用与顺序堆栈的top相同,都是与头元素的坐标相关。需要注意的点在于初始化时,要对*head操作,所以要传入*head的地址值**head,同样,撤销时也需要对*head操作,传入**head。head指向头结点,再指向栈顶元素。