堆栈的链表实现

链表是带头结点的. 每次执行入栈操作, 都是把数据压入第1个节点.

完整代码如下:

#include <stdio.h>

#define true 1;
#define false 0;
typedef int elementType;

struct s_stack {
    elementType data;
    struct s_stack* next;
};

typedef struct s_stack stack;
typedef struct s_stack* ptr_stack;

// 函数声明
ptr_stack createStack ();
void push (ptr_stack ptr, elementType x);
void print (ptr_stack ptr);
elementType pop (ptr_stack ptr);

int main () {
    int i;
    ptr_stack stackHead;
    stackHead = createStack();
    /* 入栈测试开始 */
    for (i=1; i<100; i+=8) {
        push(stackHead, i);
    }
    print(stackHead);
    /* 入栈测试结束 */

    /* 出栈测试开始 */
    // stackHead = createStack();
    elementType popValue = pop(stackHead);
    printf("被弹出的元素的值是: %d
", popValue);
    print(stackHead);
    /* 出栈测试结束 */

    return 0;
}

// 创建空栈
ptr_stack createStack () {
    ptr_stack ptr;
    ptr = (stack*)malloc(sizeof(stack));
    ptr->next = NULL;
    return ptr;
}

// 入栈
void push (ptr_stack ptr, elementType x) {
    ptr_stack curNode; // 存放当前节点
    curNode = (stack*)malloc(sizeof(stack));
    curNode->data = x;

    curNode->next = ptr->next;
    ptr->next = curNode;
}

// 打印
void print (ptr_stack ptr) {
    int length = 0; // 堆栈链表长度
    ptr = ptr->next;
    printf("堆栈链表的数据如下
");
    while (ptr != NULL) {
        printf("%d	", ptr->data);
        length += 1;
        ptr = ptr->next;
    }
    printf("
");
    printf("堆栈链表的长度是: %d
", length);
    printf("
");
}

// 出栈
// 如果栈空返回 false
// 返回被pop的元素的值, 并把该元素从栈中移除
 elementType pop (ptr_stack ptr) {
    if (ptr->next == NULL) {
        printf("栈空不能出栈
");
        return false;
    }

    ptr_stack curNode; // 指向弹出元素
    int curValue; // 保存弹出元素的值

    curNode = ptr->next;
    ptr->next = ptr->next->next;
    curValue = curNode->data;
    free(curNode);

    return curValue;
}

原文地址:https://www.cnblogs.com/asheng2016/p/7608488.html