博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构:栈(用链表实现)
阅读量:5859 次
发布时间:2019-06-19

本文共 4732 字,大约阅读时间需要 15 分钟。

hot3.png

以下是完整代码:

/* * this file is an implementation of stack with linked list * file name: stack.c * author: John Woods * date: 2015/5/9 * statement: anyone can use this file for any purpose */#include 
#include 
#define BOOL int#define TRUE 1#define FALSE 0typedef struct SNode {    int value;    struct SNode * next;}* SNode;typedef struct Stack {    int depth;    SNode top;}* Stack;/* operation declaration */void stackInit(Stack * p_myStack);void pop(Stack myStack);void push(Stack myStack);void stackClear(Stack myStack);void stackDestroy(Stack * p_myStack);BOOL isExist(Stack myStack);/* menu */void menu();/* entrance: main function */int main(void) {    Stack myStack = NULL;    int choice;    char c;    while(TRUE) {        menu();        while(!scanf("%d", &choice)) while('\n' != (c=getchar()) && EOF != c);        switch(choice) {            case 1:                stackInit(&myStack);                break;            case 2:                stackClear(myStack);                break;            case 3:                push(myStack);                break;            case 4:                pop(myStack);                break;            case 5:                stackDestroy(&myStack);                break;            default:                exit(EXIT_SUCCESS);                break;        }    }    return 0;}/* menu implementation */void menu() {    printf("\n\t****************MENU****************\n");    printf("\t*  1.initial stack  2.clear stack  *\n");    printf("\t*  3.push element   4.pop element  *\n");    printf("\t*  5.destroy stack  6.exit         *\n");    printf("\t****************MENU****************\n");    printf("Your choice:");}/* operation implementation */void stackInit(Stack * p_myStack) {    if(isExist(*p_myStack)) {        printf("This stack is already exist, cannot initial it!\n");        return;    }    if(NULL == (*p_myStack = (Stack)malloc(sizeof(struct Stack)))) {        printf("Out of memory!\n");        return;    }    (*p_myStack)->top = NULL;    (*p_myStack)->depth = 0;    printf("Initial successfully!\n");}void pop(Stack myStack) {    SNode pNode = NULL;    int out;    char c;    if(!isExist(myStack)) {        printf("This stack is not exist! Please initial it first!\n");        return;    }    if(0 == myStack->depth) {        printf("This stack is empty! Cannot pop the top value!\n");        return;    }    while(TRUE) {        out = myStack->top->value;        pNode = myStack->top;        myStack->top = myStack->top->next;        myStack->depth--;        free(pNode);        pNode = NULL;        printf("The value has been popped is %d\n", out);                if(0 == myStack->depth) {            printf("This stack is empty now, cannot continue popping!\n ");            break;        }        while('\n' != (c=getchar()) && EOF != c);        printf("Go on?(y/n):");        if('y' != (c=getchar()) && 'Y' != c) break;    }}void push(Stack myStack) {    SNode pNode = NULL;    int value;    char c;    if(!isExist(myStack)) {        printf("This stack is not exist! Please initial it first!\n");        return;    }    while(TRUE) {        if(!(pNode = (SNode)malloc(sizeof(struct SNode)))) {            printf("Out of memory!\n");            return;        }        printf("Please input the value:");        while(!scanf("%d", &value)) while('\n' != (c=getchar()) && EOF != c);        pNode->value = value;        pNode->next = myStack->top;        myStack->top = pNode;        myStack->depth++;        pNode = NULL;        printf("Push successfully!\n");            while('\n' != (c=getchar()) && EOF != c);        printf("Go on?(y/n):");        if('y' != (c=getchar()) && 'Y' != c) break;    }}void stackClear(Stack myStack) {    if(!isExist(myStack)) {        printf("This stack is not exist! Please initial it first!\n");        return;    }    SNode pNode = NULL;    while(myStack->top) {        pNode = myStack->top;        myStack->top = myStack->top->next;        free(pNode);    }    myStack->top = NULL;    myStack->depth = 0;    printf("Clear successfully!\n");}void stackDestroy(Stack * p_myStack) {    if(!isExist(*p_myStack)) {        printf("This stack is not exist! Please initial it first!\n");        return;    }    stackClear(*p_myStack);    free(*p_myStack);    *p_myStack = NULL;    printf("Destroy successfully!\n");}BOOL isExist(Stack myStack) {    if(NULL == myStack) return FALSE;    else return TRUE;}

这里想说的是typedef,typedef会“封装”出一个新的数据类型,与#define有很大的不同

/* typedef */typedef struct SName{    int data;} * SName;/* 若定义如下变量 */SName temp = (SName)malloc(sizeof(struct SName));/* 虽然 temp 实际上是个指针,但若当做参数被其它函数调用,其值仍是不会被修改的,在stack.c的stackInit()和stackDestroy()中传递参数要注意 */

转载于:https://my.oschina.net/lovewxm/blog/412809

你可能感兴趣的文章
网站 学习资源站 Centos linux
查看>>
linux下修改root密码以及找回密码的方法
查看>>
Kickstart无人值守批量安装linux系统
查看>>
什么是自定义解析?
查看>>
Alpha 冲刺报告(2/10)
查看>>
ultraedit配置
查看>>
我的友情链接
查看>>
jvm内存快照dump文件太大,怎么分析
查看>>
内存模拟磁盘,让你体验下急速
查看>>
【Memcached】memchached网络服务协议介绍说明
查看>>
搭建dhcp中继服务器
查看>>
MySQL 数据类型
查看>>
MySQL DELETE 语句
查看>>
你关注过Linked Server OLE DB选项吗?
查看>>
win7装sql server2005开发版 windows身份验证无法登陆 错误:18456
查看>>
git merge 和git rebase 命令区别
查看>>
亚洲最高带宽校园无线网诞生
查看>>
浅谈大型web系统架构
查看>>
linux下PS1命令提示符设置
查看>>
grep 过滤 IP 的 几个小实例
查看>>