`
NOthingAj
  • 浏览: 16288 次
社区版块
存档分类
最新评论

C实现链表形式的栈

 
阅读更多

一、头文件、宏及函数声明:

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

typedef enum status {
    success, overflow, underflow
} Status;

typedef int StackEntry;

typedef struct stacknode {
    StackEntry entry;
    struct stacknode* next;
} StackNode, *StackNodePtr;

typedef struct stack {
    StackNodePtr top;
} Stack, *StackPtr;

Status Stack_Push(StackPtr s, StackEntry item);
Status Stack_Pop(StackPtr s, StackEntry* item);
StackNodePtr MakeNode(StackEntry item);
StackEntry Stack_Top(StackPtr s, StackEntry* item);
int Stack_Empty(StackPtr s);

 

二、函数实现:

Status Stack_Push(StackPtr s, StackEntry item) {
    Status outcome = success;
    StackNodePtr np = MakeNode(item);
    if(np == NULL) {
        outcome = overflow;
    } else {
        np->next = s->top;
        s->top = np;
    }

    return outcome;
}

StackNodePtr MakeNode(StackEntry item) {
    StackNodePtr np = (StackNodePtr)malloc(sizeof(StackNode));
    np->entry = item;
    np->next = NULL;
    return np;
}

Status Stack_Pop(StackPtr s, StackEntry* item) {
    Status outcome = success;
    if(Stack_Empty(s)) {
        outcome = underflow;
    } else {
        StackNodePtr temp = s->top;
        s->top = temp->next;
        *item = temp->entry;
        free(temp);
    }
    return outcome;
}

StackEntry Stack_Top(StackPtr s, StackEntry* item) {
    Status outcome = success;
    if(Stack_Empty(s)) {
        outcome = underflow;
    } else {
        *item = s->top->entry;
    }
    return outcome;
}

int Stack_Empty(StackPtr s) {
    if(s->top == NULL) 
        return 1;
    else 
        return 0;
}

 

三、测试函数:

int main(int argc, char const *argv[]) {
    Status s;
    StackPtr sp = (StackPtr)malloc(sizeof(StackPtr));
    s = Stack_Push(sp, 100);
    if(s == success) {
        StackEntry* item = malloc(sizeof(StackEntry)*10);
        s = Stack_Top(sp, item);
        if(s == success) {
            printf("%d\n", sp->top->entry);
        }
        free(item);
    }
    free(sp);
    return 0;
}

 

分享到:
评论

相关推荐

    c 栈 链表 循环链表

    理解并熟练掌握栈、链表和循环链表的概念及其在C语言中的实现,是提升编程技能的关键步骤。这些基础知识不仅在C语言编程中至关重要,也是其他高级数据结构和算法的基础。在实际编程项目中,它们常被用于优化内存使用...

    数据结构试验(链表,栈,二叉树等多种算法完整试验)

    单链表是最简单的链表形式,每个节点只有一个指向后继节点的链接。在单链表中,插入和删除操作通常比数组更快,因为不需要移动后续元素。 接下来是栈,它是一种后进先出(LIFO)的数据结构,类似于日常生活中的堆叠...

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

    节点的数据设计具有一般性(使用void *data),使用链表栈实现本功能,且栈的Top指针作为每个函数的形式参数。最后以int型序号管理为实例,演示实验功能。ac_impl.c负责输出选择菜单项;test_impl.c中实现对菜单的...

    C++编程实例(c++封装链表、栈、队列).pdf

    封装链表、栈和队列是C++编程中的基础数据结构,它们提供了对数据的高效管理。链表是一种动态数据结构,允许在任意位置插入和删除元素。栈是一种后进先出(LIFO)的数据结构,通常用于递归和表达式求值等场景。队列...

    单向链表(一) 结构体、创建链表、遍历链表

    在实际编程中,链表还可以用于实现各种高级数据结构,如栈、队列和图等。同时,链表的操作如删除节点、查找节点、反转链表等也是面试和编程竞赛中常见的问题。理解和熟练掌握链表的这些基本操作对于提升编程技能至关...

    链表的数据结构,完全自创,c,c++代码

    单链表是最简单的链表形式,每个节点只有一个指向下一个节点的指针。在C和C++中,我们可以定义一个结构体来表示链表节点: ```cpp struct ListNode { int data; ListNode* next; }; ``` ### 链表的常见操作 1. *...

    链表面试题目总结 全

    面试者需要能够清晰地解释链表的基本概念,包括如何进行插入、删除、搜索等基本操作,以及实现更高级的数据结构如栈和队列。栈是后进先出(LIFO)的数据结构,可以在链表的头部进行push和pop操作,这样保证了操作的...

    数据结构实验课之单链表类实现和顺序栈实现

    1、 定义单链表类。 2、 实验验证如下算法的正确性、各种功能及指标: 1) 创建单链表;...例如:(压栈 a,压栈 b,压栈 c,压栈 d,弹栈,弹 栈,弹栈,压栈 e,弹栈,读栈顶,弹栈。屏幕应输出 d,c,b,e,a,a)

    线性链表 单链表 可运行C++和C结合的代码 结合严蔚敏编写

    - **单链表**:是最简单的一种链表形式,每个元素包含两个部分:数据域和指针域。其中数据域用于存储实际的数据信息,而指针域则用来存放指向下一个节点的地址信息。 #### 二、严蔚敏《数据结构 C语言版》中的线性...

    数据结构各个章节的C程序实现

    本压缩包文件“数据结构”包含了多个C语言实现的数据结构相关章节,涵盖了数组、链表、栈等基本概念。 1. 数组:数组是数据结构的基础,它是由相同类型元素构成的固定大小的序列。在C语言中,数组可以是一维、二维...

    线性表的链式存储(单项链表)的设计与实现

    在实际应用中,链表常常被用来解决各种问题,例如实现栈、队列、图等更复杂的数据结构,或者在文件系统、数据库索引等场景下发挥作用。理解和熟练掌握单项链表的设计与实现是学习数据结构和算法的基础,对于提升编程...

    C语言栈的图文解析和实现.pdf

    栈是一种在计算机科学中广泛应用的数据结构,其基本概念源于日常生活中的物品堆叠。栈的特点是遵循“后进先出”(LIFO, ...通过数组、单向链表和双向链表等不同的实现方式,我们可以根据实际需求选择最合适的栈实现。

    创建线性链表

    线性链表在实际应用中非常广泛,比如用于实现栈、队列等其他数据结构。 #### 核心概念解释 1. **节点(Node)**:线性链表中的基本单元,通常包含两个部分:存储数据的字段和指向下一个节点的指针。 2. **头指针...

    头歌 顺序表,链表,循环队列的基本操作和应用答案。

    这里我们讨论的是顺序表、链表以及循环队列,这些都是基本的数据结构,广泛应用于算法设计和程序实现中。 顺序表是一种线性数据结构,它在内存中按顺序连续存储元素。它的主要操作包括插入、删除和查找。在顺序表中...

    3_链表多种形态 笔记 + 作业.zip

    1. 单向链表:这是最基本的链表形式,每个节点仅有一个指针指向下一个节点。在单向链表中,只能从头节点开始按照顺序访问节点,不能像双向链表那样反向移动。 - 创建链表:首先要创建一个头节点,然后通过不断创建...

    C语言实现链式栈的模板

    链式栈是一种线性数据结构,它以链表的形式存储元素,与数组栈不同,链式栈不需预先分配固定大小的空间,具有动态扩展和收缩的能力。在C++中,我们可以利用模板类来创建泛型数据结构,适用于各种类型的数据。然而,...

    数据结构作业带或不带头结点链表

    这两种链表在C++编程语言中具有广泛的应用,是数据结构作业中的常见主题。 首先,链表是一种线性数据结构,其元素(节点)在内存中不是连续存储的,而是通过指针连接。每个节点包含两部分:数据域和指针域,指针域...

    数据结构课设之二叉树遍历

    - 在课程设计过程中,掌握了如何使用 C 语言实现栈和利用栈实现二叉树的非递归遍历方法。 - 实现栈时遇到了一些挑战,特别是对于从未自己实现过的栈,需要花时间理解和调试。 - 后序遍历的实现相对复杂,需要两次...

    设两棵二叉树的根结点地址分别为P及Q,采用二叉链表的形式存储这二棵树上所有的结点。请编写程序,判断它们是否相似。

    - **二叉链表**:用于存储二叉树的一种常见方式。每个节点包含三个部分:**节点值**、指向**左子节点**的指针和指向**右子节点**的指针。 #### 2. 二叉树的表示 - 给定的代码片段中使用了两种不同的表示方法: - `...

Global site tag (gtag.js) - Google Analytics