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

 

 # 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. MarkDown的快速入门

    简介 简单的去解释MarkDown就是html,但是将html中的元素用符号去代替使用.本文用的编译软件是Atom(神器),不多说直接上图看效果. 语法 文本 列表 区块 分割符 表格 链接 mark ...

  2. String类型

    String字符串的length属性返回的是该字符串里面16位字符的数量,如果字符串包含double-byte的字符,那么返回的数量可能不对   字符串一旦创建就修改不了 var lang = “Ja ...

  3. Js的闭包,这篇写的是比较清晰明了的

    一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量 ...

  4. Virtual

    Virtual 作用: 允许在派生类中重新定义与基类同名函数并且可以通过其类的指针或引用来访问基类何派生类的同名函数. 1. 概述简单地说,每一个含有虚函数(无论是其本身的,还是继承而来的)的类都至少 ...

  5. HTTP协议相关知识点

    主要参考 http://www.imooc.com/article/14397,来源:慕课网,作者种子_fe HTTP是超文本传输协议,主要特点有: 支持客户.服务器模式 简单快速:客户向服务器请求服 ...

  6. [转载] Dubbo架构设计详解

    转载自http://shiyanjun.cn/archives/325.html Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合 ...

  7. 重启mysql主从同步mongodb(tungsten-replicator)

    1. 连接mysql mysql -uroot -p;(mysql从库) 输入数据库密码 2. 停止主同步 mysql> stop slave; 3. 清数据 将mongo库数据清空 4. 杀主 ...

  8. 在SQL Server Express版本中没有代理功能如何自动备份数据库

    因为是免费的且单个数据库可以支持到10GB,对于一般企业完全足够了,也就将就使用了,备份将分为两步: 1.创建备份脚本 2.创建系统的计划任务进行每天的备份 详细做法如下: 1.创建备份脚本 打开SS ...

  9. ligerUI---ListBox(列表框可移动)

    写在前面: 对于可移动的列表框,ligerui中也对其进行了封装,可以直接照着demo拿来用,不过那都是直接在页面上静态初始化的数据,那么如何从后台获取? 前面有了对ligerui的一些组件的使用经验 ...

  10. laravel 表单验证 Exists 规则的基本使用方法

    public function rules(){ return [ 'm_pushing_frequency_level_id' => 'integer|required|exists:m_pu ...