41深入理解C指针之---指针与栈
一、借助第40指针与链表的相关内容,稍微修改即可:
1、定义头文件stack.h代码如下:
#include <stdlib.h>
#include <stdio.h> #ifndef stack_h
#define stack_h
typedef int DataType; typedef struct _node{
DataType data;
struct _node *next;
} Node; typedef struct _stack{
Node *head;
Node *tail;
} Stack; void initStack(Stack *);
void pushStack(Stack *, DataType);
void popStack(Stack *);
int getLength(Stack *);
void dispStack(Stack *); #endif
头文件中依旧是完成数据类型的声明和数据的操作函数的声明。
2、头文件对应的实现文件stack.c代码如下:
#include "stack.h" //栈初始化
void initStack(Stack *stack){
stack->head = NULL;
stack->tail = NULL;
} //栈入
void pushStack(Stack *stack, DataType iData){
Node *node = (Node *)malloc(sizeof(Node));
node->data = iData;
node->next = NULL; if(stack->head == NULL){
stack->tail = node;
}else{
node->next = stack->head;
}
stack->head = node; return; } //栈出
void popStack(Stack *stack){
if(stack->head->next == NULL){
stack->head = NULL;;
}else{
stack->head = stack->head->next;
} return;
} //栈长度
int getLength(Stack *stack){
Node *node = stack->head;
int i = ;
while(node != NULL){
node = node->next;
i++;
} return i;
} //栈输出
void dispStack(Stack *stack){
Node *node = stack->head;
int i = ;
while(node != NULL){
printf("the %dth node: %d\n", i + , node->data);
node = node->next;
i++;
}
printf("disp finished!\n"); return;
}
代码说明:
1、入栈函数使用链表的头插法
2、出栈函数直接将链表的头节点删除即可实现出栈功能
3、stack.c对应的测试文件testStack.c代码如下:
#include "stack.h" int main(int argc, char **argv)
{
Stack *stack1 = (Stack *)malloc(sizeof(Stack));
printf("the first:\n");
initStack(stack1);
pushStack(stack1, );
pushStack(stack1, );
pushStack(stack1, );
pushStack(stack1, );
pushStack(stack1, );
printf("The length: %d\n", getLength(stack1));
dispStack(stack1);
printf("the second:\n");
popStack(stack1);
printf("The length: %d\n", getLength(stack1));
dispStack(stack1);
popStack(stack1);
dispStack(stack1);
printf("The length: %d\n", getLength(stack1));
pushStack(stack1, );
dispStack(stack1);
printf("The length: %d\n", getLength(stack1)); return ;
}
测试函数完成所有函数的功能测试,功能通过就OK!
41深入理解C指针之---指针与栈的更多相关文章
- 00深入理解C指针之--- 指针之外
该系列文章源于<深入理解C指针>的阅读与理解,由于本人的见识和知识的欠缺可能有误,还望大家批评指教. C语言从诞生之初就非常善于和硬件打交道,经过这么多年的发展之后,其灵活性和超强的特征是 ...
- 02深入理解C指针之---指针类型和值
该系列文章源于<深入理解C指针>的阅读与理解,由于本人的见识和知识的欠缺可能有误,还望大家批评指教. 1.指针的类型: 可以在声明指针时,指定指针的类型,例如: (1)void *x 声 ...
- 06深入理解C指针之---指针操作和比较
该系列文章源于<深入理解C指针>的阅读与理解,由于本人的见识和知识的欠缺可能有误,还望大家批评指教. 指针作为一种特殊类型的变量,必须遵守C语言中变量先声明后使用的原则.本节内容中指针的操 ...
- 10深入理解C指针之---指针运算和比较
该系列文章源于<深入理解C指针>的阅读与理解,由于本人的见识和知识的欠缺可能有误,还望大家批评指教. 指针运算有很多种,主要有指针的声明*.指针的解引*.指针指向(*).或->.指针 ...
- 理解C语言中指针的声明以及复杂声明的语法
昨天刚把<C程序设计语言>中"指针与数组"章节读完,最终把心中的疑惑彻底解开了.如今记录下我对指针声明的理解.顺便说下怎样在C语言中创建复杂声明以及读懂复杂声明. 本文 ...
- 这样子来理解C语言中指针的指针
友情提示:阅读本文前,请先参考我的之前的文章<从四个属性的角度来理解C语言的指针也许会更好理解>,若已阅读,请继续往下看. 我从4个属性的角度来总结了C语言中的指针概念.对于C语言的一个指 ...
- 从四个属性的角度来理解C语言的指针也许会更好理解
文章会在文末更新! 关于指针是什么,很多教材已经作出了定义,大多数都会定义为"存放变量内存地址的变量".从这句话中我觉得除了让我知道这个定义有11个字以外,其他就没什么用了.我个人 ...
- 理解git 中的HEAD指针&branch指针
理解git 中的HEAD指针&branch指针 Yooye关注 2019.02.28 10:44:32字数 492阅读 668 HEAD指针 使用git checkout 来移动HEAD指针, ...
- 深入理解C语言-函数指针
函数指针在C++中有着重要的应用,函数的函数名其本质就是代表一个地址,这个地址叫做函数入口,得到这个地址就可以对这个函数进行各种操作. 函数类型基础 函数三要素: 名称.参数.返回值 C语言中的函数有 ...
- 深入理解C语言-二级指针三种内存模型
二级指针相对于一级指针,显得更难,难在于指针和数组的混合,定义不同类型的二级指针,在使用的时候有着很大的区别 第一种内存模型char *arr[] 若有如下定义 char *arr[] = {&quo ...
随机推荐
- vue中文本域限制字数的方法
用watch方法,来限制字数 <template> <div class="box"> <textarea v-model="title&q ...
- 【转】vxworks的default boot line说明
boot程序的主要功能是引导vxworks 内核,所以boot程序需要知道vxworks的内核存放在何处,通过什么手段去获取.在vxworks缺省的boot程序里有一条内建的default boot ...
- unbuntu14下Qt4.8 和MySQL连接问题 QSqlDatabase: QMYSQL driver not loaded QSqlDatabase: available drivers: QSQLITE
使用 QSqlDatabase::addDatabase创建数据库时 会报错: QSqlDatabase: QMYSQL driver not loaded QSqlDatabase: availab ...
- Linux菜鸟起飞之路【七】文件合并、归档和压缩
一.文件合并操作 1.覆盖符号与追加符号 a)“>”代表将左边文件的内容覆盖右边文件的内容,如果右边文件不存在则创建这个文件 b)“>>”代表将左边文件的内容追加到右边文件中,如果右 ...
- NoSQL 数据库之MongoDB
1.MongoDB简介 1.1什么是MongoDB MongoDB 是一个跨平台的,面向文档的数据库,是当前 NoSQL 数据库产品中最热门的一种.它介于关系数据库和非关系数据库之间,是非关系数据库当 ...
- 建立,查询二叉树 hdu 5444
Elven Postman Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- hdu 6333
Problem Description There are n apples on a tree, numbered from 1 to n.Count the number of ways to p ...
- MySQL-状态Waiting on empty queue引申
MySQL 事件调度器示例演示 我们大家都知道MySQL 事件调度器是在 MySQL 5.1 中新生的一个较为特殊的功能,其可以作为定时任务调度器,来取代部分原先只能用操作系统任务调度器才能完成的定时 ...
- Python虚拟机函数机制之位置参数的默认值(五)
位置参数的默认值 在Python中,允许函数的参数有默认值.假如函数f的参数value的默认值是1,在我们调用函数时,如果传递了value参数,那么f调用时value的值即为我们传递的值,如果调用时没 ...
- Python并发(一)
假设我们要从一个网站用Python程序下载5张图片,最传统的思路就是写个for循环挨个挨个下载,但是这样做有个缺点,就是除了第一张,每张图片都必须等待前一张图片下载完毕后,才可以开始下载.由于网络有很 ...