c语言数据结构------------链栈

  该链栈以无头节点的单链表体现

#include 
#include 
#include 

//链栈,本链栈用不带头结点的单链表表示
typedef struct {
    int data;
    struct Stack *next;
} Stack;

//定义一个能指向单链表首节点的结构体
typedef struct {
    Stack *head;
} Hnode;

//给链栈插入数据,必须以第二个元素开始插入,stack不能为空
bool Push(Hnode *hnode, int data) {
    //程序bug,必须以第二元素插入
    if (hnode == NULL) {
        return false;
    }
    //为新增的元素分配存储空间
    Stack *s = (Stack *) malloc(sizeof(Stack));
    //赋值
    s->data = data;
    //连接首节点
    s->next = hnode->head;
    //重置头指针
    hnode->head = s;
    return true;
}

//给栈链删除元素,e表示删除的数据
bool Pop(Hnode *hnode, int *e) {
    //栈链为空或头指针为空,无法删除
    if (hnode == NULL) {
        return false;
    }
    //e为待删除数据
    *e = hnode->head->data;
    //进行逻辑删除
    //但物理位置上并未进行删除
    hnode->head = hnode->head->next;
    return true;
}

//取出栈顶元素
bool Get(Hnode *hnode, int *e) {
    //栈链为空,无法取出
    if (hnode == NULL) {
        return false;
    }
    //e为取出的元素
    *e = hnode->head->data;
    return true;
}


int main(void) {
    //初始化
    Stack *stack = NULL;
    //为链栈分配空间
    stack = malloc(sizeof(Stack));
    //为首节点赋值
    stack->data = 1;
    //头指针指向首节点
    Hnode *hnode = (Hnode *) malloc(sizeof(Hnode));
    hnode->head = stack;
    printf("%d\n", stack->data);
    printf("开始测试\n");

    Push(hnode, 2);
    Push(hnode, 3);
    Push(hnode, 4);
    //取出栈顶元素
    printf("取出栈顶元素:%d\n", hnode->head->data);

    int *e = (int *) malloc(sizeof(int));
    //删除栈顶元素
    Pop(hnode, e);
    printf("删除栈顶元素:%d\n", *e);
    //取出栈顶元素
    Get(hnode, e);
    printf("取出栈顶元素:%d\n", *e);

    Pop(hnode, e);
    Get(hnode, e);
    printf("取出栈顶元素:%d\n", *e);

}

你可能感兴趣的:(数据结构,c语言,算法,考研)