是不是直接贴代码不太好,我竟然不知道说什么。

写这个考虑的问题,或者是纠结的问题是这个头指针怎么处理,也就是栈的顶部,最后采用的是初始化第一个栈空间浪费掉,栈顶是有元素的。好像应该去学习下画图,没图不太好说。

写数据结构栈的时候发现自己的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实现(使用双链表)的更多相关文章

  1. C++栈(stack)、队列(queue)、链表(list)的常用函数

    C++队列Queue是一种容器适配器,它给予程序员一种先进先出(FIFO)的数据结构.1.back() 返回一个引用,指向最后一个元素2.empty() 如果队列空则返回真3.front() 返回第一 ...

  2. [数据结构]——链表(list)、队列(queue)和栈(stack)

    在前面几篇博文中曾经提到链表(list).队列(queue)和(stack),为了更加系统化,这里统一介绍着三种数据结构及相应实现. 1)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ...

  3. 栈stack(2):栈的链表实现

    定义 从上一篇我们知道,栈(stack)是一个只允许一端进行删除插入操作的线性表.同时,我们联想到线性表的链式结构,其特点是用一组任意的存储单元存储线性表的数据元素,因此我们选择使用链表去实现栈,规定 ...

  4. Python与数据结构[1] -> 栈/Stack[0] -> 链表栈与数组栈的 Python 实现

    栈 / Stack 目录 链表栈 数组栈 栈是一种基本的线性数据结构(先入后出FILO),在 C 语言中有链表和数组两种实现方式,下面用 Python 对这两种栈进行实现. 1 链表栈 链表栈是以单链 ...

  5. JVM内存模型——堆(heap)、栈(stack)和方法区(method)

      JAVA的JVM的内存可分为3个区:堆(heap).栈(stack)和方法区(method) 堆区:堆内存用于存放由new创建的对象和数组.堆是JVM管理的内存中最大的一块,堆被所有线程共享,目的 ...

  6. 数据结构图文解析之:数组、单链表、双链表介绍及C++模板实现

    0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...

  7. 堆heap和栈Stack(百科)

    堆heap和栈Stack 在计算机领域,堆栈是一个不容忽视的概念,堆栈是两种数据结构.堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除.在单片机应用中,堆栈 ...

  8. 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现

      本篇是java数据结构与算法的第2篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型   栈是 ...

  9. linux内核的双链表list_head、散列表hlist_head

    一.双链表list_head 1.基本概念 linux内核提供的标准链表可用于将任何类型的数据结构彼此链接起来. 不是数据内嵌到链表中,而是把链表内嵌到数据对象中. 即:加入链表的数据结构必须包含一个 ...

随机推荐

  1. router+x

    vue-router官方的路由管理器 包含的功能: ——绑定方法进行跳转   路由嵌套   写的不一样搜索的路由路径也不一样   二级路由   设置默认路由   导航守卫: 用于强制跳转或者取消的方式 ...

  2. 用于构建 RESTful Web 服务的多层架构

    作者:Bruce Sun, Java 架构师, IBM 出处:http://www.ibm.com/developerworks/cn/web/wa-aj-multitier/ 用于构建 RESTfu ...

  3. 基于better-scroll封装一个上拉加载下拉刷新组件

    1.起因 上拉加载和下拉刷新在移动端项目中是很常见的需求,遂自己便基于better-scroll封装了一个下拉刷新上拉加载组件. 2.过程 better-scroll是目前比较好用的开源滚动库,提供很 ...

  4. [NOIP2012提高组]开车旅行

    题目:洛谷P1081.Vijos P1780.codevs1199. 题目大意:有n座海拔高度不相同的城市(编号1~n),两城市的距离就是两城市海拔之差.规定每次只能从编号小的城市走到编号大的城市. ...

  5. Vue.js 笔记之 img src

    固定路径(原始html) index.html如下,其中,引号""里面就是图片的路径地址 ```<img src="./assets/1.png"> ...

  6. python_元组、字典

    1.元组无法修改,只能索引2.只有两种方法 count 和 indexnames = ("Alex","jack")print(names.count(&quo ...

  7. 2019-03-28 Python SQL 的注释

    SQL Server 多行注释 : ctrl + k + c SQL Server 单行注释:  -- Python 单行注释:# Python多行注释:''' '''

  8. Unity的Json解析<二>–写Json文件

    本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/50378805 作者:car ...

  9. 2015 Multi-University Training Contest 6 hdu 5361 In Touch

    In Touch Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total ...

  10. C中操作文件的几种模式

    使用文件的方式共同拥有12种,以下给出了它们的符号和意义.  文件打开方式  意义 rt  仅仅读打开一个文本文件.仅仅同意读数据  wt  仅仅写打开或建立一个文本文件,仅仅同意写数据  at  追 ...