接着上一次的顺序栈,今天我记一下链栈,因为我也是刚学不久,有些地方也稍稍理解不了,所以,一起共勉。我会用我自己结合教材上画的图,争取跟代码一起结合,用文字和图最大化的解释代码,这样的话大家就可以很容易的懂了。在看本文之前,建议初学者们先看看书上的链栈的解释,这里我将不会再仔细的说明了。假如你先看书再来看文章,效果会很不错。废话不多说了,大神勿喷,有错误请在下方评论区指出,让我和后来的初学者们一起进步。

 

 # include<stdio.h>
# include<stdlib.h>//malloc free 的头文件  或者用# include<malloc.h>
# define FALSE 0
# define TRUE 1
typedef struct node//定义节点
{
    int data;
    struct node * next;
} stacknode;
typedef struct//定义一个链栈
{
    stacknode * top;  //这是一个链栈的指针 就是一个箭头 名为top  专门指向一个有着数据域和指针域的类型节点
    int count;//计数器 记录链栈的元素个数
} linkstack;
图示如下:
void init(linkstack * s);//初始化
int em(linkstack * s);//判断是否为空(链栈一般不会为满)
int push(linkstack * s,int a);//入栈
int pop(linkstack * s,int * a);//出栈
int ding(linkstack * s,int * a);//只取栈顶元素(不对栈有任何操作)
int length(linkstack * s,int *a);//取链栈长度
void init(linkstack * s)
{
    s->top=NULL;//该指针箭头指向为空
    s->count=0;//初始化时长度为零
}
图示如下:
int em(linkstack * s)
{
    return (s->top==NULL? TRUE:FALSE);
}
int push(linkstack * s,int  a)
{
    stacknode * p=(stacknode *)malloc(sizeof(stacknode));//申请生成新节点
    if(p==NULL)//申请不成功
        return FALSE;
    else
    {
        p->data=a;//挂载
        p->next=s->top;//新节点的指针域指向原栈顶节点
        s->top=p;//栈顶指针指向新节点
        s->count++;
        return TRUE;
    }
}
图示如下:
大家思考一下,上面三行代码的顺序不可以乱,这是为什么呢?
int pop(linkstack * s,int *a)
{
    stacknode * p;//定义临时变量存储节点            我也挺想不通为啥要弄个临时节点
    if(em(s))
        return FALSE;
    else
    {
        p=s->top;//把节点赋给临时节点     //其实这时p与s->top已经融为一体了(为栈顶取了新名字)
        * a =p->data;//将栈顶元素的值发送出去
        s->top=p->next;
        s->count--;
        free(p);//所以free(p)就是free(s->top)
        return TRUE;
    }
}
图示如下:
int ding(linkstack * s,int * a)
{
    if(em(s))
        return FALSE;
    else
    {
        * a=s->top->data;
        return TRUE;
    }
}
int length(linkstack * s)
{
    return s->count;
}
int main(void)
{
    linkstack s;
    int a,b,c,d;
    init(&s);
    push(&s,1);
    push(&s,12);
    push(&s,15);
    push(&s,124);
    push(&s,237);
    ding(&s,&a);
    c=length(&s);
    printf("栈顶元素为:%d\n链栈长度为:%d\n",a,c);
    while(!em(&s))
    {
        pop(&s,&d);
        printf("%d ",d);
    }
    return 0;
}
代码实现效果图:
以上就是C语言实现链栈的方法了,虽然可能以后我们用别的语言时不用自己再编写这些代码,但是基本的原理我们还是要懂的。有错误或者问题可以留言,谢谢。

 

C语言简单实现链栈基本几个功能的更多相关文章

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

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

  2. 数据结构 - 链栈的实行(C语言)

    数据结构-链栈的实现 1 链栈的定义 现在来看看栈的链式存储结构,简称为链栈. 想想看栈只是栈顶来做插入和删除操作,栈顶放在链表的头部还是尾部呢?由于单链表有头指针,而栈顶指针也是必须的,那干吗不让它 ...

  3. C语言实现链栈以及基本操作

    链栈,即用链表实现栈存储结构.链栈的实现思路同顺序栈类似,顺序栈是将数顺序表(数组)的一端作为栈底,另一端为栈顶:链栈也如此,通常我们将链表的头部作为栈顶,尾部作为栈底,如下下图所示: 将链表头部作为 ...

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

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

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

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

  6. 链栈的基本操作(C语言)

    栈的链式储存结构称为链栈.链栈的节点类型与链式线性表的节点类型 定义相同,不同的是它是仅在表头进行操作的单链表.链栈通常用不带头节 点的单链表来实现,栈顶指针就是链表的头指针 ,如图所示: 代码如下: ...

  7. C语言链栈

    链栈与链表结构相似 typedef int elemtype; typedef struct linkedStackNode{ elemtype e; struct linkedStackNode * ...

  8. C语言数据结构链栈(创建、入栈、出栈、取栈顶元素、遍历链栈中的元素)

    /**创建链栈*创建一个top指针代表head指针*采用链式存储结构*采用头插法创建链表*操作 创建 出栈 入栈 取栈顶元素*创建数据域的结构体*创建数据域的名称指针*使用随机函数对数据域的编号进行赋 ...

  9. 纯C语言实现链栈

    #include <stdio.h> #include <stdlib.h> typedef int ElemType; typedef struct StackNode{ E ...

随机推荐

  1. 跳槽 & 思维导图

    个人博客原文: 跳槽 & 思维导图 今年的冬天有点"冷".给大家来点实在的东西. 不知道大家在跳槽的时候是怎么做的?直接投简历面试?还是准备了一段时间,复习一波知识点后再投 ...

  2. 获取model的自定义特性

    class Program { static void Main(String[] args) { var t = typeof(A); var pName = t.GetProperty(" ...

  3. Linux系统打开文件最大数量限制(进程打开的最大文件句柄数设置)

    ulimit  [-HSTabcdefilmnpqrstuvx  [limit]] 利用ulimit命令可以对资源的可用性进行控制. -H选项和-S选项分别表示对给定资源的硬限制(hard limit ...

  4. 从零开始学习PYTHON3讲义(八)列表类型跟冒泡排序

    <从零开始PYTHON3>第八讲 ​前面我们见过了不少的小程序,也见过了不少不同类型的变量使用的方法.但目前我们涉及到的,还都是单个的变量和单个的立即数.以变量来说,目前我们见到的,基本都 ...

  5. 规避 React 组件中的 bind(this)

    React 组件中处理 onClick 类似事件绑定的时候,是需要显式给处理器绑定上下文(context)的,这一度使代码变得冗余和难看. 请看如下的示例: class App extends Com ...

  6. 带着新人学springboot的应用09(springboot+异步任务)

    本来想说说检索的,不过不知道什么鬼,下载ElasticSearch太慢了,还是放一下,后面有机会再补上!今天就说个简单的东西,来说说任务. 什么叫做任务呢?其实就是类中实现了一个什么功能的方法.常见的 ...

  7. C语言实现循环队列的初始化&进队&出队&读取队头元素&判空-2

    /*顺序表实现队列的一系列操作(设置flag标志不损失数组空间)*/ #include<stdio.h> #include<stdlib.h> #define Queue_Si ...

  8. Vim编辑器显示行数

    很多时候,我们编写代码的时候,编译器报错,在某一行,这时我们虽然可以:行数来跳转,但是没有直观的行数,总是感觉不妥,vi和vim默认是没有行号的,那么怎么办呢?下面我就教你怎么设置行号. 工具: 一台 ...

  9. leetcode — validate-binary-search-tree

    import apple.laf.JRSUIUtils; /** * Source : https://oj.leetcode.com/problems/validate-binary-search- ...

  10. 流式大数据计算实践(7)----Hive安装

    一.前言 1.这一文学习使用Hive 二.Hive介绍与安装 Hive介绍:Hive是基于Hadoop的一个数据仓库工具,可以通过HQL语句(类似SQL)来操作HDFS上面的数据,其原理就是将用户写的 ...