栈(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内核提供的标准链表可用于将任何类型的数据结构彼此链接起来. 不是数据内嵌到链表中,而是把链表内嵌到数据对象中. 即:加入链表的数据结构必须包含一个 ...
随机推荐
- ES6 Symbol类型 附带:Proxy和Set
七种数据类型 ·Symbol ·undefined ·null ·Boolean ·String ·Number ·Object let a = Symbol('this is a symbol'); ...
- Multipartfile与File类型相互转换
特殊情况下需要做转换 1.M转F File file = new File(path); FileUtils.copyInputStreamToFile(multipartFile.getInputS ...
- vue登录
<template> <section class="wrap-page wrap-page-u" style="padding-top:2rem;&q ...
- 标题:u-boot 移植步骤详解
1 U-Boot简介U-Boot,全称Universal Boot Loader,是遵循GPL条款的开放源码项目.从FADSROM.8xxROM.PPCBOOT逐步发展演化而来.其源码目录.编译形式与 ...
- 新手学python-Day4-作业
购物车程序 要求: 1.启动程序后,让用户输入工资,然后打印商品列表 2.允许用户根据商品编号购买商品 3.用户选择商品后,检查余额是否足够,够了就扣款,不够就提醒 4.可随时退出,退出时,打印已购买 ...
- DCL授权命令
create user 用户名//创建用户 grant DBA to 用户名//授权 revoke //撤销权限
- UVALive 5545 Glass Beads
Glass Beads Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVALive. Origin ...
- android canvas 画图笔记
android canvas 画图笔记 1.PathEffect类 画虚线 Paint p = new Paint(Paint.ANTI_ALIAS_FLAG); p.setStyle(Paint.S ...
- C++11时间具体解释
转载请注明出处:http://blog.csdn.net/luotuo44/article/details/46854229 C++ 11添加了三个与时间相关的类型:时间段.时钟.时间点. 以史为鉴 ...
- poj1961--Period(KMP求最小循环节)
Period Time Limit: 3000MS Memory Limit: 30000K Total Submissions: 13511 Accepted: 6368 Descripti ...