栈(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内核提供的标准链表可用于将任何类型的数据结构彼此链接起来. 不是数据内嵌到链表中,而是把链表内嵌到数据对象中. 即:加入链表的数据结构必须包含一个 ...
随机推荐
- luogu P4245 【模板】任意模数NTT MTT
Code: #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) # ...
- jq——事件
http://www.w3school.com.cn/jquery/jquery_ajax_intro.asp $(document),$(body) 加载事件: $(document).ready( ...
- NTP同步底层实现
RFC http://www.ietf.org/rfc/rfc5905.txt https://www.eecis.udel.edu/~mills/ntp/html/select.html https ...
- IOS - 退出程序
- (void)exitApplication { OAAppDelegate *app = [UIApplication sharedApplication].delegate; UIWindow ...
- BZOJ 4044 Virus synthesis (回文自动机+dp)
题目大意: 你可以在一个串的开头或者末尾加入一个字符,或者把当前整个串$reverse$,然后接在前面或者后面,求达到目标串需要的最少操作次数 对目标串建出$PAM$ 定义$dp[x]$表示当前在回文 ...
- 查看系统进程:ps、top
1.ps命令:提供最近进程的快照.显示当前活跃进程的简要信息. 常见使用: (1)与grep命令配合查找是否有相应进程存活 ps -ef | grep ksmd ps -Af | grep ksmd ...
- jquery 用于操作动态元素的delegate/on方法
delegate() 方法的事件处理程序适用于当前或未来的元素(比如由脚本创建的新元素). 在做项目中有很多由ajax动态生成的html标签,jquery对这些标签不会响应\((selector).c ...
- js实现新闻滚动实例
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- linux内核(三)文件系统
1.为什么需要根文件系统 (1)init进程的应用程序在根文件系统上(2)根文件系统提供了根目录/(3)内核启动后的应用层配置(etc目录)在根文件系统上.几乎可以认为:发行版=内核+rootfs(4 ...
- Android application framework 分析[in process]
application activity application service application UI system application sdk tool JVM 1 activity t ...