#小菜鸡的数据结构之路
#仿照《大话数据结构》
#栈的链式存储,只在栈顶操作
#IDE VC++6.0
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int data;
struct Node *next;
}node,*LinkStackptr;
typedef struct LS
{
LinkStackptr top;
int count;
}LinkStack;
/*-----------初始化栈-----------------*/
void InitalStack(LinkStack *s) //初始化犯的错 当做有头结点处理了 即(s->top->next=NULL)
{ //s->top=NULL 这样处理才是对的 没有头结点
s->top=NULL; //还是得头脑清晰
s->count=0;
}
/*-------------插入栈顶元素--------------*/
void InsertElement(LinkStack *s,int element)
{
LinkStackptr p=(LinkStackptr)malloc(sizeof(node));
p->data=element;
p->next=s->top;
s->top=p;
s->count++;
}
/*--------------删除栈顶元素---------------*/
void DeleteElement(LinkStack *s,int* element) //把删除的栈顶元素保存起来
{ //用int* 可以使得本函数不用有返回值
LinkStackptr p=s->top; //同时在主函数调用时候 传递的是地址
*element=p->data;
s->top=p->next;
free(p);
s->count--;
}
/*-----------打印栈顶元素-----------------*/
void Print(LinkStack s)
{
if(s.count)
printf("栈顶元素是:%2d",s.top->data);
else
printf("The stack is empty.");
printf("\n");
}
/*---打印栈里的所有元素----------*/
void PrintAllElement(LinkStack s)
{
LinkStackptr p=s.top;
printf("栈内元素有:\n");
while(p) //如果这里是if(p)便只能打印栈顶元素 所以注意是 选择还是循环
{
printf("\t%2d\t",p->data); //同时也提供了打印栈顶元素的另一种方法
p=p->next;
}
printf("\n");
if(p==NULL)
printf("有什么有,没有啦~\n");
printf("\n");
}
void main()
{
LinkStack s;
int element;
//int *element1=NULL;
InitalStack(&s);
InsertElement(&s,1);
InsertElement(&s,2);
InsertElement(&s,3);
PrintAllElement(s);
DeleteElement(&s,&element);
PrintAllElement(s);
Print(s);
printf("被删除的栈顶元素:%2d\n",element);
//DeleteElement(&s,element1);
//printf("被删除的栈顶元素:%2d\n",*element1);//这种形式会出错 虽然同类型(目前还未知原因)
}
#栈的顺式结构和单链表的顺式相仿便没有总结
#若有需要请留言