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

 

 # 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++版)适合新手

    **栈是一种操作受限制的线性表,太多官方的话我也不说了,我们都知道栈元素是先进后出的,它有两种存储结构,分别是顺序存储结构和链式存储结构. **今天我先记一下顺序存储结构,后面我会加上链式存储结构的. ...

  3. Go 语言从新手到大神:每个人都会踩的五十个坑(转)

    Go语言是一个简单却蕴含深意的语言.但是,即便号称是最简单的C语言,都能总结出一本<C陷阱与缺陷>,更何况Go语言呢.Go语言中的许多坑其实并不是因为Go自身的问题.一些错误你再别的语言中 ...

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

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

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

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

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

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

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

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

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

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

  9. C语言链栈

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

随机推荐

  1. Windows环境下Android Studio安装和使用教程

    Windows环境下Android Studio安装和使用教程 来源: http://www.cnblogs.com/liuhongfeng/archive/2015/12/30/5084896.ht ...

  2. Linux库函数制作(静态库、动态库)

    Linux库函数制作(静态库.动态库) 静态库与动态库 链接方式 链接分为两种:静态链接.动态链接 静态链接: 由链接器在链接时将库的内容加入到可执行程序中 静态链接的特点是: 优点: 对运行环境的依 ...

  3. Jungle Roads(最小生成树)

    Jungle Roads Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...

  4. [java基础] java 左移和右移

    今天搜到一个比较好用的在线编译器,希望和大家分享. 除了java还有c++....,地址是http://www.tutorialspoint.com/compile_java_online.php 另 ...

  5. Three.js 保存camera(视角)设置到数据库,包括场景的缩放、旋转、移动等

    最近在做的项目中遇到需要保存当前的3d管道视角设置的问题,用户希望在对3d场景内的管道进行了缩放.旋转.移动之后可以将场景当前的视角状态保存在数据库中,并在下次加载时读取. 经过不断的尝试和研究,在同 ...

  6. Cordova使用build命令出错: Could not create the Java Virtual Machine.

    这是因为虚拟机内存不足导致的,解决方案如下: _JAVA_OPTIONS=-Xmx512M

  7. oracle数据库管理系统常见的错误(一)

    oracle数据库管理系统常见的错误之一如下: Listener refused the connection with the following error:ORA-12519, TNS:no a ...

  8. C#泛型集合之List

    1.命名空间:System.Collections.Generic(程序集:mscorlib)2.描述: 1).表示可通过索引访问的对象的强类型列表:提供用于对列表进行搜索.排序和操作的方法. 2). ...

  9. csv格式的数据存储到mysql

    python写的,有点冗余,先码出来~~~~ 这是data_stored.py的代码 # -*- coding:utf-8 -*- # 存数据到mysql (只存了时间数字) import pymys ...

  10. Fis3迁移至Webpack实战

    Webpack从2015年9月第一个版本横空初始至今已逾2载.它的出现,颠覆了一大批主流构建如Ant.Grunt和Gulp等等.腾讯NOW直播IVWEB团队之前一直采用Fis构建,本篇文章主要介绍从F ...