栈(stack)--c实现(使用双链表)
是不是直接贴代码不太好,我竟然不知道说什么。
写这个考虑的问题,或者是纠结的问题是这个头指针怎么处理,也就是栈的顶部,最后采用的是初始化第一个栈空间浪费掉,栈顶是有元素的。好像应该去学习下画图,没图不太好说。
写数据结构栈的时候发现自己的2个地方需要进一步补习,用的时候心中没谱---指针和内存分配,看来我还是太水,代码里有3个warning没改出来。
#include <stdio.h> typedef struct node
{
int data;
struct node* next;
struct node* pre;
}Node; //Stack 一直指向栈顶
typedef Node* Stack; void InitStack(Stack* stack);
void DeleteStack(Stack* stack);
int TopStack(Stack*);
void PushStack(Stack* stack, int elem);
int PopStack(Stack *stack);
int IsNull(Stack*);
void PrintStack(Stack *); void PrintStack(Stack *stack)
{
Node* preNode = *stack;
while((preNode->pre != NULL)
&&preNode)
{
printf("%d", preNode->data);
preNode = preNode->pre;
if(preNode->pre != NULL){
printf("<==");
}
}
printf("\n"); }
//1 means NULL
//stack-->node-->datamem
//这个地方第一次写传的是Stack stack,为什么报错?因为穿的是值,就是一个copy,pre不能确定一定是NULL
int IsNull(Stack *stack)
{
return ((*stack)->pre == NULL);
} int PopStack(Stack *stack)
{
if(IsNull(stack))
{
printf("empty stack.\n");
return -;
}
int popData = -;
popData = (*stack)->data;
Node* popNode = NULL ;
popNode = *stack;
*stack = (*stack)->pre;
(*stack)->pre = popNode->pre->pre;
(*stack)->next = NULL; popNode->pre->pre->next = (*stack); free(popNode);//warning return popData;
}
void InitStack(Stack* stack)
{
(*stack)->next = NULL;
(*stack)->pre = NULL;
(*stack)->data = -;
return ;
} int TopStack(Stack *stack)
{
return (*stack)->data;
} void PushStack(Stack *stack, int elem)
{
//Node *pushNode = (Node*)malloc(sizeof(Node));
Node *pushNode = (Node*) malloc(sizeof(Node));//warning
if(pushNode == NULL)
{
printf("malloc error at line %d.", __LINE__);
return;
} pushNode->data = elem;
pushNode->next = NULL;
pushNode->pre = *stack;
(*stack)->next = pushNode;
*stack = (*stack)->next; } void DeleteStack(Stack* stack)
{ Node* preNode = stack;
while((*stack)->pre != NULL)
{
PopStack(stack); }
free(*stack); return ;
} int main(void)
{
printf("Hello World!\n");
Stack *stack =NULL;
stack = (Stack*)malloc(sizeof(stack));//warning
*stack = (Node*)malloc(sizeof(Node));
InitStack(stack);
IsNull(stack);
printf("isNull=[%d]\n", IsNull(stack));
printf("the top ele is [%d]\n", (*stack)->data);
printf("push elem 1, 2, 3, 4, 3\n");
PushStack(stack, );
PrintStack(stack);
PushStack(stack, );
PushStack(stack, );
PushStack(stack, );
PushStack(stack, );
printf("print the curr stack.\n");
PrintStack(stack);
printf("Pop the stack and print the curr stack.\n");
PopStack(stack);
PrintStack(stack); printf("the top elem is %d\n", TopStack(stack)); return ;
}
是不是也把运行结果贴上去??
QT运行的,懒得去开虚拟机在linux跑,太费事,还要改MAKEFILE.
运行结果:/*******************begin
Hello World!
isNull=[1]
the top ele is [-1]
push elem 1, 2, 3, 4, 3
1
print the curr stack.
3<==4<==3<==2<==1
Pop the stack and print the curr stack.
4<==3<==2<==1
the top elem is 4
************end*******/
下一篇写队列吧,想了下定义头尾指针好像会好用点。
栈(stack)--c实现(使用双链表)的更多相关文章
- C++栈(stack)、队列(queue)、链表(list)的常用函数
C++队列Queue是一种容器适配器,它给予程序员一种先进先出(FIFO)的数据结构.1.back() 返回一个引用,指向最后一个元素2.empty() 如果队列空则返回真3.front() 返回第一 ...
- [数据结构]——链表(list)、队列(queue)和栈(stack)
在前面几篇博文中曾经提到链表(list).队列(queue)和(stack),为了更加系统化,这里统一介绍着三种数据结构及相应实现. 1)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ...
- 栈stack(2):栈的链表实现
定义 从上一篇我们知道,栈(stack)是一个只允许一端进行删除插入操作的线性表.同时,我们联想到线性表的链式结构,其特点是用一组任意的存储单元存储线性表的数据元素,因此我们选择使用链表去实现栈,规定 ...
- Python与数据结构[1] -> 栈/Stack[0] -> 链表栈与数组栈的 Python 实现
栈 / Stack 目录 链表栈 数组栈 栈是一种基本的线性数据结构(先入后出FILO),在 C 语言中有链表和数组两种实现方式,下面用 Python 对这两种栈进行实现. 1 链表栈 链表栈是以单链 ...
- JVM内存模型——堆(heap)、栈(stack)和方法区(method)
JAVA的JVM的内存可分为3个区:堆(heap).栈(stack)和方法区(method) 堆区:堆内存用于存放由new创建的对象和数组.堆是JVM管理的内存中最大的一块,堆被所有线程共享,目的 ...
- 数据结构图文解析之:数组、单链表、双链表介绍及C++模板实现
0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...
- 堆heap和栈Stack(百科)
堆heap和栈Stack 在计算机领域,堆栈是一个不容忽视的概念,堆栈是两种数据结构.堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除.在单片机应用中,堆栈 ...
- 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现
本篇是java数据结构与算法的第2篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型 栈是 ...
- linux内核的双链表list_head、散列表hlist_head
一.双链表list_head 1.基本概念 linux内核提供的标准链表可用于将任何类型的数据结构彼此链接起来. 不是数据内嵌到链表中,而是把链表内嵌到数据对象中. 即:加入链表的数据结构必须包含一个 ...
随机推荐
- 使用node+mysql进行后端开发
使用koa: koa2是一个类,所以引入koa后,要创建实例化“对象”,才能使用koa内部封装的方法. 设置监听端口: 处理http请求: 1.http请求处理链 A.通过app.use()注册asy ...
- 如何在使用layer.prompt在输入值为空的情况下点击确定继续执行逻辑?
突然发现在使用LayUI时,用到弹出层layer.prompt时,如果文本框输入值是空的话点击确定没有反应,不能向下执行. 但是我又需要在这种情况下去继续执行判断或逻辑时该怎么做?? 示例:原代码如下 ...
- K3内部表数据名称
在后台数据库ICClassType表中,字段FID<0的是老单,FID>0的是新单.----------------系统设置------------------------FStatus: ...
- laydate日期范围控制
1.html <input type="text" id="startTime" name="startTime" class=&qu ...
- IDEA Maven 打包运行 jar java.io.FileNotFoundException: 问题?
当 使用 idea maven 将项目打包运行的时候,能够成功运行,但是总会跑到 xxx\xxx\lib 下 找jar包 如下异常: java.io.FileNotFoundException: D: ...
- jvm 虚拟机参数_方法区内存分配
1.方法区( 永久区 ) 和堆一样,方法区是一块所有线程共享的区域,他用于保存系统类的信息.默认情况下 -XX:MaxPermSize 为 64m.如果系统运行时产生大量的类,就需要设置一个合适方法区 ...
- linux内核(一)基础知识
1,linux内核的基础知识 1.1 linux内核版本 从内核源码顶层目录Makefile中可以看到: VERSION和PATCHLEVEL组成主版本号,比如2.4.2.5.2.6等,稳定版本的德主 ...
- 基于nginx的静态网页部署
背景: 一序列的html网页需要部署 基于nginx的部署: 本文采用的基于openresty的nginx 配置. 简单地配置 Nginx 的配置文件,以便在启动 Nginx 时去启用这些配置即可实现 ...
- 洛谷 P2243 电路维修
P2243 电路维修 题目背景 Elf 是来自Gliese 星球的少女,由于偶然的原因漂流到了地球上.在她无依无靠的时候,善良的运输队员Mark 和James 收留了她.Elf 很感谢Mark和Jam ...
- 大话设计模式C++实现-第17章-适配器模式
一.UML图 关键词:Client须要Request()函数,Adaptee提供的是SpecificRequest()函数,Adapter提供一个Request()函数将Adaptee和Specifi ...