喜羊羊系列之数据结构栈链

博客地址:http://blog.csdn.net/muyang_ren

栈链数据链接示意图

top为指向最后的节点的指针,栈头为一个NULL空地址

1、头文件

head.h

#ifndef __linkstack_H__
#define __linkstack_H__

#include <stdio.h>
#include <stdlib.h>

typedef int datatype;
typedef struct node{
    datatype data;
    struct node *next;
}linkstack, *linkstack_p;

extern void linkstack_add(linkstack_p *, int ); //入栈
extern void linkstack_init(linkstack_p * );//初始化表头
extern void linkstack_out(linkstack_p *,int *);//出栈
extern int top_empty(const linkstack_p);//判断地址是否为空
#endif

2、栈链实现函数

linkstack.c

#include "head.h"

//设置栈表头为null
void linkstack_init(linkstack_p *top){
    *top=NULL;
}

//开辟新的节点
void linkstack_new(linkstack_p *new){

    *new=(linkstack_p)malloc(sizeof(linkstack));
    if(NULL == *new){
        perror("malloc\n");
        exit(-1);
    }
}

//入栈
void linkstack_add(linkstack_p *top , int n){

    linkstack_p new;
    linkstack_new(&new);

    new->data = n;

    //入栈
    new->next=*top;
    *top = new;
}

//栈为空
int top_empty(const linkstack_p top){
    if(top==NULL)
        return 0;
    else
        return 1;
}

//出栈
void linkstack_out(linkstack_p *top, int *num){

    linkstack_p p;
    p=*top;

    *num = (*top)->data;  //将栈中最后进的数据放进num的地址
    *top = (*top)->next;
    free(p);
}

3、实现功能函数

main.c

#include "head.h"
//实现 10 进制数转换成 8 进制数

int main(void)
{
    int num, n;
    char *ch="0";
    linkstack_p top;

    linkstack_init(&top);              //初始化双向链表

    printf("输入十进数:");
    scanf("%d",&num);
    if(num<0)
    {
        ch="-0";
        num = -num;
    }

    while(num!=0){
        linkstack_add(&top,num%8);
        num=num/8;
    }

    printf("八进制数为: %s",ch);

    while(top_empty(top)){
        linkstack_out(&top,&n);
        printf("%d",n);
    }
    printf("\n");

    return 0;
}

时间: 2024-11-09 02:17:36

喜羊羊系列之数据结构栈链的相关文章

喜羊羊系列之数据结构内核链表

博客地址:http://blog.csdn.net/muyang_ren 内核链表示意图 关于内核链表与简单的双向连表,是否有过疑惑 内核链表定义: struct list_head{ struct list_head *next,*prev; }; struct doublelist{ datatype data; struct list_head list; }double_list; 简单的双向链表定义: struct doublelist{ datatype data; struct d

喜羊羊系列之数据结构双向链表

博客:http://blog.csdn.net/muyang_ren 关于双向链表的原理很多都有说明,我这只是与前面的内核链表作个对比,同样实现数据的增删差改. 截图: 1.main.c #include "doublelist.h" int main(void) { int num, i; double_plist list; doublelist_init(&list); //初始化双向链表 printf("\n请输入链表长度:"); scanf(&qu

[考研系列之数据结构]线性表之栈

?基本概念 栈的定义 限定仅在表尾进行插入或删除的线性表 组成 栈顶 栈底 基本操作 入栈(PUSH) 往栈中插入一个元素 弹栈(POP) 从栈顶删除一个元素 栈的表示 顺序栈 链栈 对于顺序栈,有两个指针base和top base指向栈底 top指向栈顶 对于栈的一些基本情况: 栈不存在时候 base=NULL 栈为空时  top=base 栈的长度 top-base 链栈略过. 栈的应用 1 数制转换 数制转换我们使用一种称之为"辗转相除法"的算法.此算法的基本原理基于: N=(N

数据结构4_链栈

用指针方式实现栈,相对于顺序栈,指针方式不用指定栈的大小, 先定义一个栈节点类,再定义一个链栈类,为使链栈类能访问栈节点的元素,设链栈类为栈节点类的友元类. #include<iostream>using namespace std;class LinkStack;class StackNode   //设计每个节点的类型{    char *data;    StackNode *next;    friend class LinkStack;   //设置友元类,以便LinkStack类访

数据结构学习笔记-排序/队/栈/链/堆/查找树/红黑树

排序: 插入排序:每次从剩余数据中选取一个最小的,插入已经排序完成的序列中 合并排序:将数据分成左右两组分别排序,然后合并,对每组数据的排序递归处理. 冒泡排序:重复交换两个相邻元素,从a[1]开始向a[0]方向冒泡,然后a[2]...当a[i]无法继续往前挤的时候说明前面的更小了,而且越往前越小(挤得越往前) 堆排序:构造最大堆,每次取走根结点(自然是最大的),再调用MAX-HEAPIFY算法(见后文的堆)恢复最大堆的性质,重复取走根结点 快速排序(对A[r]-A[n]进行排序): 1.从序列

[考研系列之数据结构]线性表概述

1.脑图 2.表示方法 按照数据结构概述所说,线性表有两种表示方法分别是顺序表示和链式表示,链表就是链式表示的典型. 我们知道链式表示是分配了n块内存空间,可以认为彼此不连续,所以不能用偏移量去定位每个元素. 下面就先说最简单的单向链表: 如果每个数据元素能有一个指针指向下一个元素的话,那么只需要知道第一个数据元素就能一个一个的遍历整个链表了,这就是单向链表. 对于每个链表元素我们称之为节点,每个节点都有两个域:数据域&指针域 数据域就是数据元素所在的区域,而指针域则是存储指向另一个节点的指针的

[考研系列之数据结构]线性表之队列

基本概念 队列的定义 队列是一种只能在表的一头插入,另一头删除的线性表,简而言之具有FIFO的特性 组成 队头 队尾 扩展 双端队列 只能在两端进行删除插入操作的线性表 实现 链队列 顺序队列 循环队列 循环队列 循环队列是将顺序队列臆造成一个环,如图 循环队列有以下参数 front 指向队头的指针 rear 指向队尾的指针 SIZE 循环最大队列长度 对于循环队列,初始状态的时候 front=rear=0; 每次insert的时候 Insert((front++)%SIZE); 那么,当循环队

[考研系列之数据结构]线性表之链表

1.链表分类 通过线性表概述,我们知道了链表这样一种数据结构,它又分成三类,分别是 单向链表 循环链表 双向链表 单向链表 单向链表的指针域只有一个指向下一个节点的指针,需要注意几点: 1.头指针--指向第一个节点 2.最后一个结点的指针指向NULL 3.头结点--在链表的第一个结点之前附设一个结点,它的数据域为空 所以,我们看到:  单向链表为空的<=>链表有且只有一个头结点<=>头结点的指针指向NULL 循环链表 循环链表和单向链表最大的不同就是:最后一个结点的指针不再指向NU

栈及栈的链式存储结构(栈链)

栈:线性结构,后进先出.栈(Stack)是一种特殊的线性表(顺序表,链表)只在表尾进行删除和插入操作. 注意:对于栈来说,表尾称为栈的栈顶(top),表头称为栈底(bottom). 栈也是线性结构的一种特例.与队列不同,他只有一个口,只能从这里读或者写数据,这个口称为栈顶(top).栈是一种先进后出的数据结构.先进来的元素会放入栈底,而后进来的元素被放在它的上面,最后进来的元素的上面的位置,称为栈顶. 栈所提供的操作比一般的线性表要少很多,只提供:初始化.销毁.判断是否为空.求栈的长度.清空栈.