栈(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内核提供的标准链表可用于将任何类型的数据结构彼此链接起来. 不是数据内嵌到链表中,而是把链表内嵌到数据对象中. 即:加入链表的数据结构必须包含一个 ...
随机推荐
- day05-1 执行Python程序的两种方式
目录 执行Python程序的两种方式 第一种:交互式 第二种:命令行式 三个步骤 两种方式的区别 执行Python程序的两种方式 第一种:交互式 在cmd中运行 优点:直接给出结果,执行效率高,及时报 ...
- NodeJS加密算法(转)
nodejs中常用加密算法 1.Hash算法加密: 创建一个nodejs文件hash.js,输入内容如下: 1 var crypto = require('crypto'); //加载crypto ...
- 一些AngularJs
# AngularJs部分 # 详情可参考文档----依赖注入--不是主动地获取而是被动的接收,需要什么就要什么,这样灵活较高,如:$scope ----指令--内部:ng- 如:ng- ...
- 安装Nginx的各种报错的解决
如题,本人环境Ubuntu14.0虚拟机,安装一个nginx服务器来运行我的fastDfs文件管理的.但是安装出现了各种问题: sudo ./configure --prefix=/usr/local ...
- JQuery封装ajax的方法
1.$.post方法 $.post(url[,data][,callback][,type]) url:请求的后台程序地址 data:发送到后台的数据 callback:载入成功时回调函数,该函数参数 ...
- JavaScript正則表達式知识汇总
Js 正則表達式知识汇总 正則表達式: 1.什么是RegExp?RegExp是正則表達式的缩写.RegExp 对象用于规定在文本中检索的内容. 2.定义RegExp:var +变量名=new RegE ...
- UNIX环境高级编程(6):文件I/O(2)
文件共享: UNIX系统支持在不同进程间共享打开的文件. 内核使用三种数据结构表示打开的文件.他们之间的关系决定了在文件共享方面一个进程对还有一个进程可能产生的影响: (1)每一个进程在进程表中都有一 ...
- web程序定时器
package com.timer; import java.util.Calendar; import java.util.Date; import java.util.Timer; import ...
- 计算机网络 4.网络层与IP协议
网络中的每一台主机和路由器都有一个网络层部分.而路由器中也没有网络层以上的层次.网络层是协议栈中最复杂的层次. 转发forwarding:当一个分组到达某路由器的输入链路时.该路由器将分组移动到适当的 ...
- C#高级编程五十八天----并行集合
并行集合 对于并行任务,与其相关紧密的就是对一些共享资源,数据结构的并行訪问.常常要做的就是对一些队列进行加锁-解锁,然后运行类似插入,删除等等相互排斥操作. .NET4提供了一些封装好的支持并行操作 ...