链栈的建立与基本操作

论坛 期权论坛 脚本     
匿名网站用户   2020-12-19 18:41   11   0

一、链栈的建立

1.定义结点结构体,含有数据和指针两个成员变量;

2.定义栈结构体,含有栈顶指针和栈中元素个数两个成员变量,其中栈顶指针是结点结构体指针类型;

3.栈顶指针当作头指针指向第一个元素,利用头插法实现入栈;

二、代码如下

/*
项目名称:链栈的建立与基本操作

编译环境:VC++ 2008

作者相关:。。。

最后修改:2019.6.21


学习目标:初始化、销毁、清空、判空、求长、返回栈顶元素、插入元素、删除元素、输出栈中元素

注意事项:1.测试所有功能是否正常

*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define OK         1
#define ERROR      0

typedef int  ElemType;
typedef bool Status;

//定义结点
typedef struct SNode{

 ElemType data;
 struct SNode *next;

}SNode,*SLNode;

//定义栈
typedef struct{

 SLNode top;//top指针指向栈顶元素
 int   count;//记录栈中元素个数

}SLinkStack;

Status Init_LStack(SLinkStack *s);

Status Clear_LStack(SLinkStack *s);

Status Destroy_LStack(SLinkStack *s);

Status Empty_LStack(SLinkStack s);

int    Length_LStack(SLinkStack s);

Status GetTop_LStack(SLinkStack s,ElemType *e);

Status Push(SLinkStack *s,ElemType e);//在栈顶插入元素,相当于不带头结点的头插法

Status Pop(SLinkStack *s,ElemType *e);

Status visit(ElemType c);

Status Out_LStack(SLinkStack s);

int main()
{
 SLinkStack s;
 ElemType e;

 if(Init_LStack(&s))
  printf("初始化成功!\n\n");
 else
  printf("初始化失败!\n\n");

 if(Empty_LStack(s))
  printf("栈为空!\n\n");
 else
  printf("栈非空!\n\n");

 srand(time(0));
 for(int i=0;i<5;i++)
 {
  e = rand()%20+1;
  Push(&s,e);
 }
 Out_LStack(s);

 int k=Length_LStack(s);
 printf("栈的长度为:%d \n\n",k);

 GetTop_LStack(s,&e);
 printf("栈顶元素为:%d \n\n",e);

 Pop(&s,&e);
 printf("删除的元素为:%d \n\n",e);

 Out_LStack(s);

 Clear_LStack(&s);

 Destroy_LStack(&s);

 return 0;
}

Status Init_LStack(SLinkStack *s)
{
 s->top=(SLNode)malloc(sizeof(SNode));
 if(!s)
  return ERROR;

 s->top = NULL;
 s->count = 0;

 return OK;
}

Status Clear_LStack(SLinkStack *s)
{
 SLNode p,q;
 p = s->top;

 while(p)
 {
  q = p;
  p = p->next;
  free(q);
 }
 s->top = NULL;
 s->count = 0;

 return OK;
}

Status Destroy_LStack(SLinkStack *s)
{
 SLNode p,q;
 p = s->top;

 while(p)
 {
  q = p;
  p = p->next;
  free(q);
 }
 free(s->top);//销毁最初创建的结点

 return OK;
}

Status Empty_LStack(SLinkStack s)
{
 if(s.count == 0)
  return true;
 else
  return false;
}

int    Length_LStack(SLinkStack s)
{
 return s.count;
}

Status GetTop_LStack(SLinkStack s,ElemType *e)
{
 if(s.top==NULL)
  return ERROR;
 else
  *e = s.top->data;

 return OK;
}

Status Push(SLinkStack *s,ElemType e)
{
 SLNode p;
 p = (SLNode)malloc(sizeof(SNode));
 if(!p)
  return ERROR;
 p->data = e;
 p->next = s->top;
 s->top  = p;
 s->count++;

 return OK;
}

Status Pop(SLinkStack *s,ElemType *e)
{
 SLNode p;

 if(s->top==NULL)
  return ERROR;

 *e = s->top->data;
 p  = s->top;
 s->top  = s->top->next;//这是链表,不能用--
 free(p);
 s->count--;

 return OK;
}

Status visit(ElemType c)
{
 printf("%d ",c);
 return OK;
}

Status Out_LStack(SLinkStack s)
{
 SLNode p=s.top;

 printf("栈内容为: ");
 while(p)
 {
  visit(p->data);
  p = p->next;
 }

 printf("\n\n");

 return OK;
}

三、效果

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1136255
帖子:227251
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP