#include<stdio.h>
#include<windows.h>
#include<malloc.h>
typedef int elemtype;
typedef struct linknode //链表的定义
{
elemtype data;
struct linknode *next;
} listack;
void initstack(listack *&s) //初始化
{
s=(listack *)malloc(sizeof(listack));
s->next=NULL;
}
void push(listack *s) //进栈
{
int e;
listack *p;
printf("请输入进栈元素:");
scanf("%d",&e);
p=(listack *)malloc(sizeof(listack));
p->data=e;
p->next=s->next;
s->next=p;
printf("进栈成功\n");
}
void gettop(listack *s) //取栈顶元素
{
int t;
if(s->next==NULL)
printf("栈空,取值失败!\n");
else
{
t=s->next->data;
printf("取值成功,栈顶元素为:%d\n",t);
}
}
void stackempty(listack *s) //判断链栈是否为空
{
if(s->next==NULL)
printf("栈为空\n");
else
printf("栈不为空\n");
}
void pop(listack *&s) //出栈
{
listack *p;
int e;
if(s->next!=NULL)
{
p=s->next;
e=p->data;
s->next=p->next;
free(p);
printf("出栈成功,栈顶元素为:%d\n",e);
}
else
printf("栈为空,出栈失败\n");
}
void destroy(listack *&s)
{
listack *p=s,*q=s->next;
char m;
getchar();
printf("确定要销毁栈,请输入y 否则不销毁!\n");
scanf("%c",&m);
if(m=='y')
{
while(q!=NULL)
{
free(p);
p=q;
q=p->next;
}
free(p);
printf("销毁成功!\n");
exit(0);
}
else
printf("链栈未销毁!\n");
}
void main()
{
listack *s;
int m;
printf(" ******************欢迎使用**********************\n");
initstack(s);
while(1)
{
printf("请选择:");
printf(" 1 进栈\n");
printf(" 2 判断栈是否为空\n");
printf(" 3 取栈顶元素\n");
printf(" 4 出栈\n");
printf(" 5 销毁栈\n");
printf(" 6 退出\n");
scanf("%d",&m);
switch(m)
{
case 1:push(s);break;
case 2:stackempty(s);break;
case 3:gettop(s);break;
case 4:pop(s);break;
case 5:destroy(s);break;
case 6:exit(0);
default:printf("输入错误,请重新输入\n");
}
}
}
算法与数据结构之栈的链式存储
时间: 2024-11-16 13:10:49
算法与数据结构之栈的链式存储的相关文章
算法与数据结构之队列的链式存储
#include<stdio.h>#include<malloc.h>#include<windows.h>typedef int elemtype; typedef struct qnode //数据节点的定义{elemtype data;struct qnode *next;}qnode; typedef struct //链队的定义{qnode *front;qnode *rear;}liqueue; void initqueue(liqueue *&q)
数据结构的C++实现之栈的链式存储结构
当单链表限定只能在头部进行插入和删除操作的时候,即为链栈,一般我们会将单链表的头指针和栈的栈顶指针top合二 为一,通常对链栈来说,是不需要头节点的,因为我们维护了栈顶指针.对于链栈来说,基本不存在栈满的情况,除非内存 已经没有可以使用的空间,对于空栈来说,链表原定义是头指针指向空,那么链栈的空其实就是top = = NULL的时候. 示例代码:(改编自<大话数据结构>) #include <iostream> using namespace std; typedef int
C++中实现队列类链式存储与栈类链式存储的代码示例_C 语言
队列类链式存储 代码: linkqueue.hpp // 队列类 #pragma once #include "linklist.hpp" template <typename T> class LinkQueue { public: LinkQueue(); ~LinkQueue(); public: int clear(); int append(T &t); int retieve(T &t); int header(T &t); int l
基本数据结构:栈的链式表示
以下为操作栈的算法,该栈为动态栈. 在该栈中,pTop指向的节点中存放该栈的栈顶数据,pBottom指向的节点的上一个节点存放该栈的栈底数据,pBottom指向的节点中不存放有效数据,这样做的目的是为了在进行入栈和出栈时方便对栈的操作,而不用考虑特殊情况 操作系统:ubuntu 编译软件:gcc 结果截图:
数据结构Java实现05----栈:顺序栈和链式堆栈
一.堆栈的基本概念: 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除操作. 先进后出:堆栈中允许进行插入和删除操作的一端称为栈顶,另一端称为栈底.堆栈的插入和删除操作通常称为进栈或入栈,堆栈的删除操作通常称为出栈或退栈. 备注:栈本身就是一个线性表,所以我们之前讨论过线性表的顺序存储和链式存储,对于栈来说,同样适用. 二.堆栈的抽象数据类型: 数据集合: 堆栈的
数据结构之自建算法库——二叉树的链式存储及基本运算
本文是数据结构基础系列(6):树和二叉树中第9课时二叉树的基本运算及其实现的例程. 二叉树的链式存储算法库采用程序的多文件组织形式,包括两个文件: 1.头文件:btree.h,包含定义二叉树的链式存储数据结构的代码.宏定义.要实现算法的函数的声明: #ifndef BTREE_H_INCLUDED #define BTREE_H_INCLUDED #define MaxSize 100 typedef char ElemType; typedef struct node { ElemType d
大话数据结构二:线性表的链式存储结构(单链表)
1. 线性表的链式存储结构:指的是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的,这就意味着这些数据元素可以存在内存未被占用的任意位置. 2. 结点:结点由存放数据元素的数据域和存放后继结点地址的指针域组成. 1.)顺序存储结构中,每个数据元素只需要存数据元素的信息就可以了. 2.)链式存储结构中,除了要存储数据元素信息外,还要存储它的后继元素的存储地址. 3.)链表中第一个结点叫头结点,它的存储位置叫做头指针,它的数据域可以不存储任何信息,链表的最后一个结
数据结构的C++实现之队列的链式存储结构
队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出而已,我们把它简称为链队列.为了操作上的 方便,我们将队头指针指向链队列的头节点,而队尾指针指向终端节点.空队列时,front和rear都指向头节点. 示例程序 :(改变自<大话数据结构>) #include<iostream> using namespace std; typedef int ElemType; typedef struct Node { ElemType data; struct Node *nex
c语言-关于栈的链式结构,请问以下代码问题在哪?
问题描述 关于栈的链式结构,请问以下代码问题在哪? #include #include struct node { int data; struct node next; }; struct node *createemptystack_link(void) { struct node *top; top=(struct node)malloc(sizeof(struct node)); if(top!=NULL) top->next=NULL; else printf("out of s