c/c++ 链栈

链栈

下面的代码实现了以下功能

函数 功能描述
push 压入
pop 弹出
show_list 打印
clear 释放所有内存空间
destroy 释放所有内存空间

nodestack.h

#ifndef __NODESTACK__
#define __NODESTACK__ #include <stdio.h>
#include <malloc.h>
#include <assert.h>
#include <memory.h>
#include <stdbool.h> typedef int ElemType; typedef struct Node{
ElemType data;
struct Node *next;
}Node; typedef struct nodestack{
int size;
Node *base;
Node *top;
}nodestack; void init(nodestack*);
void push(nodestack*, ElemType);
void show_list(nodestack*);
void pop(nodestack*);
int length(nodestack*);
void clear(nodestack*);
void destroy(nodestack*);
#endif

nodestack.c

#include "nodestack.h"

Node* createNode(ElemType val){
Node* n = (Node*)malloc(sizeof(Node));
n->data = val;
n->next = NULL;
return n;
}
void init(nodestack* stack){
stack->size = 0;
stack->top = NULL;
stack->base = NULL;
}
void push(nodestack* stack, ElemType x){
Node* n = createNode(x);
//当栈为空的时候
if(stack->base == NULL){
stack->top = stack->base = n;
n->next = NULL;
stack->size++;
return;
}
n->next = stack->top;
stack->top = n;
stack->size++;
}
void show_list(nodestack* stack){
Node* top = stack->top;
while(top != NULL){
printf("%d\n", top->data);
top = top->next;
}
}
void pop(nodestack* stack){
if(stack->size == 0)return; Node* n = stack->top;
stack->top = stack->top->next;
free(n);
stack->size--;
}
int length(nodestack* stack){
return stack->size;
}
void clear(nodestack* stack){
Node* top = stack->top;
Node* tmp;
while(top != NULL){
tmp = top;
top = top->next;
free(tmp);
}
stack->top = stack->base = NULL;
stack->size = 0;
}
void destroy(nodestack* stack){
clear(stack);
}

nodestackmain.c

#include "nodestack.h"

int main(){
nodestack list;
init(&list);
int select = 1;
ElemType item;
int index;
while(select){
printf("*****************************************\n");
printf("*** [1] push [2] pop ***\n");
printf("*** [3] show_list [4] length ***\n");
printf("*** [5] clear [6] destroy ***\n");
printf("*** [0] quit ***\n");
printf("*****************************************\n");
printf("请选择:>");
scanf("%d", &select);
if(0 == select)
break;
switch(select){
case 1:
printf("请输入要插入的数据>\n");
scanf("%d",&item);
push(&list, item);
show_list(&list);
break;
case 2:
pop(&list);
show_list(&list);
break;
case 3:
show_list(&list);
break;
case 4:
printf("length is %d\n", length(&list));
show_list(&list);
break;
case 5:
clear(&list);
show_list(&list);
break;
case 6:
destroy(&list);
break;
default:
printf("输入的选择错误,请重新选择\n");
break;
}
}
destroy(&list);
}

c/c++ 链栈的更多相关文章

  1. 03链栈_LinkStack--(栈与队列)

    #include "stdio.h" #include "stdlib.h" #include "io.h" #include " ...

  2. 从零开始学C++之数据封装与抽象:分别用C和C++来实现一个链栈

    下面通过分别用C和C++来实现一个链栈(链表实现),从中体会数据封装抽象的思想: C语言实现:  C++ Code  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...

  3. java与数据结构(6)---java实现链栈

    栈之链式存储结构链栈 链栈 栈的链式存储结构成为链栈.链栈是没有头结点,头结点就是栈顶指针top. 代码结构 package list; public interface Stackable;公共接口 ...

  4. 链栈之C++实现

    链栈是借用单链表实现的栈.其不同于顺序栈之处在于: 1.链栈的空间是程序运行期间根据需要动态分配的,机器内存是它的上限.而顺序栈则是 静态分配内存的. 2.链栈动态分配内存的特性使得它一般无需考虑栈溢 ...

  5. C++实现链栈的基本操作

    之前对顺序栈写了基本操作,认为有必要也动手练练栈的链表实现. 对于链栈,一般不会出现栈满的情况. 链栈头文件定义例如以下: #ifndef CSTOCK_H_ #define CSTOCK_H_ ty ...

  6. 【小白成长撸】--链栈(C语言版)

    // 链栈.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <stdio.h> #include <st ...

  7. C语言简单实现链栈基本几个功能(适合新手看,大神可指正)

            接着上一次的顺序栈,今天我记一下链栈,因为我也是刚学不久,有些地方也稍稍理解不了,所以,一起共勉.我会用我自己结合教材上画的图,争取跟代码一起结合,用文字和图最大化的解释代码,这样的话 ...

  8. 数据结构——Java实现链栈

    一.分析 栈是限定仅在表的一端进行插入或删除操作的线性表,对于栈来说,操作端称为栈顶,另一端则称为栈底,栈的修改是按照后进先出的原则进行的,因此又称为后进先出的线性表. 链栈是指采用链式存储结构实现的 ...

  9. C语言实现链栈的初始化&进栈&出栈&读取栈顶元素

    /*链表实现栈的一系列操作*/ #include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 typede ...

  10. C语言简单实现链栈基本几个功能

            接着上一次的顺序栈,今天我记一下链栈,因为我也是刚学不久,有些地方也稍稍理解不了,所以,一起共勉.我会用我自己结合教材上画的图,争取跟代码一起结合,用文字和图最大化的解释代码,这样的话 ...

随机推荐

  1. Ubuntu 安装网卡驱动

    搭建Linux平台的无线热点,需要无线网卡和驱动都要支持 AP. 试了下Ubuntu平台默认驱动并不支持AP模式,所以需要更换驱动,具体操作步骤如下: 1.找到自己网卡芯片的型号,由于我的环境是搭建在 ...

  2. shiro源码篇 - 疑问解答与系列总结,你值得拥有

    前言 开心一刻 小明的朋友骨折了,小明去他家里看他.他老婆很细心的为他换药,敷药,然后出去买菜.小明满脸羡慕地说:你特么真幸福啊,你老婆对你那么好!朋友哭得稀里哗啦的说:兄弟你别说了,我幸福个锤子,就 ...

  3. Oracle 如何开启归档模式

    Oracle开启归档 场景:某所的数据库没有开启归档,如何开启归档模式的文档. 1.查看oracle归档状态 SQL> archive log list; 数据库日志模式 非存档模式 //目前不 ...

  4. [JavaScript] 前端模块编程实现

    前端模块化 前端早期写代码都是全局变量满天飞,这种情况会造成全局命名空间污染,变量冲突等问题 var a = 1; var b = 2; function c(){} function d(){} 后 ...

  5. [转]Node.js框架对比:Express/Koa/Hapi

    本文转自:https://www.cnblogs.com/souvenir/p/6039990.html 本文翻译自: https://www.airpair.com/node.js/posts/no ...

  6. [android] 请求码和结果码的作用

    当一个界面中要要开启多个带有返回值的activity时,这个时候,就需要用到请求码和结果码了 调用startActivityForResult(intent,requestCode)方法,开启acti ...

  7. python基础学习(二)注释和算术运算符

    注释 1. 注释的作用 注释就是对某些代码进行标注说明,以增强代码的可读性.我们在写程序的时候,编写的某一部分代码的意图不太明显,这时候就需要对这一部分代码加以说明,来明确这一部分到的意图.一般的编程 ...

  8. 腾讯云下的CentOS7 安装最新版Python3.7.0

    第一步下载Python3.7.0 刚开始我是在windows上下载之后 传到FTP服务器上的 后来发现使用以下命令可以更快捷地下载到服务器 *  wget https://www.python.org ...

  9. RPC调用与GC垃圾回收

    RPC调用 多个服务协同完成一次业务时,由于业务约束(如红包不符合使用条件.账户余额不足等).系统故障(如网络或系统超时或中断.数据库约束不满足等),都可能造成服务处理过程在任何一步无法继续,使数据处 ...

  10. 汇编语言--微机CPU的指令系统(五)(条件设置字节指令)

    (10)条件设置字节指令 条件设置字节指令(Set Byte Conditionally)是80386及其以后CPU所具有的一组指令.它们在测试条件方面与条件转移是一致的,但在功能方面,它们不是转移, ...