首页 > 其他分享 >C语言实现顺序栈、单链栈、双向链栈

C语言实现顺序栈、单链栈、双向链栈

时间:2022-09-29 19:13:29浏览次数:58  
标签:head 单链 return LNode int C语言 链栈 NULL data

#define Maxlength 8

/**
 * 数据结构类型:顺序栈
 * 插入方法:尾插法
 * 是否有头节点:否
 * 说明:在主函数直接定义一个结构体节点,取地址作形参,避免使用malloc函数而考虑二重指针问题
 */

typedef struct Stack {
    int data[Maxlength];
    int top;      //结构体内不能赋值
}LStack;

int StackInit(LStack *L) { //初始化
    L->top = -1;
}

int StackIn(LStack* L,int x) {
    if(L->top == Maxlength-1) {
        return -1;   //栈满
    }
    L->data[++L->top] = x;
    return 1;
}

int StackOut(LStack* L){
    if(L->top == -1){
        return -1;
    }
    return L->data[L->top--];
}

/*
void main() {
    LStack p;
    StackInit(&p);
    StackIn(&p,1);
    StackIn(&p,2);
    StackIn(&p,3);
    printf("%d",StackOut(&p));
    printf("%d",StackOut(&p));
    printf("%d",StackOut(&p));
    printf("%d",StackOut(&p));
}
*/
#include <malloc.h>
#include "stdio.h"

/**
 * 数据结构类型:单链栈
 * 插入方法:头插法
 * 是否有头节点:否
 * 说明:函数返回头节点版本,在弹栈时只能选择弹出栈顶值(栈顶没有被删除)或者返回头节点(栈顶真正被删除)。
 */


typedef struct Linknode {
    int data;
    struct Linknode* next;
}LNode;


LNode* LinkStackIn(LNode* head,int x) {
    if(head == NULL) {   //判空
        head = (LNode*)malloc(sizeof(LNode));
        head->data = x;
        head->next = NULL;
        return head;
    }
    LNode* newnode = (LNode*)malloc(sizeof(LNode));
    newnode->data = x;
    newnode->next = head;
    head = newnode;
    return head;
}

int LinkStackOut(LNode* head){
    if(head == NULL) {
        return -1; //链表为空
    }
    int result = head->data;
    printf("result = %d\n",result);
    LNode* p = head;
    head = head->next;
    free(p);
    return head;
}

void LinkStackNull(LNode* head) {
    if(head == NULL) {
        printf("该栈为空\n");
    } else {
        printf("该栈不空\n");
    }
}
/*
void main(){
    LNode *head = NULL;
    head = LinkStackIn(head,6);
    head = LinkStackIn(head,1);
    head = LinkStackIn(head,2);
    head = LinkStackOut(head);
    head = LinkStackOut(head);
    LinkStackNull(head);
    head = LinkStackOut(head);
    LinkStackNull(head);
}
 */

`#include <malloc.h>
#include "stdio.h"

/**
 * 数据结构类型:双向链栈
 * 插入方法:尾插法
 * 是否有头节点:否
 * 说明:使用的是二重指针对链栈进行操作,当函数需要对链表进行修改时使用二重链表,才能将修改的结果同步到主函数。
 *      使用此方法,出栈时既可以弹栈,也能返回值
 */

typedef struct DLinkStack {
    struct DLinkStack* pre;    //前驱
    int data;
    struct DLinkStack* next;   //后继
}DLink;

void DStackIn(DLink** S,int x) {   //入栈
    if(*S == NULL) {
        *S = (DLink*) malloc(sizeof(DLink));
        (*S)->data = x;
        (*S)->pre = NULL;
        (*S)->next = NULL;
    } else {
        DLink *newNode = (DLink *) malloc(sizeof(DLink));
        newNode->data = x;
        newNode->pre = *S;
        (*S)->next = newNode;
        newNode->next = NULL;
        (*S) = newNode;
    }
}

int DStackOut(DLink** S) {
    if(*S == NULL) {
        return -1;
    }
    DLink *p = *S;
    *S = (*S)->pre;
    int result = p->data;
    free(p);
    return result;

}

void main() {
    DLink* L = NULL;
    DStackIn(&L,1);
    DStackIn(&L,2);
    DStackIn(&L,3);
    printf("%d",DStackOut(&L));
    printf("%d",DStackOut(&L));
}

标签:head,单链,return,LNode,int,C语言,链栈,NULL,data
From: https://www.cnblogs.com/Tayoou/p/16742662.html

相关文章

  • 初探c语言第一天
    1.库函数和用户函数​库函数用户函数需要自己根据需要设定()中放置变量2.存放变量和常量需要定义inta=变量  constintA=常量​​3.scanf一定要打&     ......
  • 【C语言_9】快速掌握分支结构!
    1.分支结构的标准公式//单条语句if(测试条件)条件为真所执行的语句else条件为假所执行的语句//多条语句if(测试条件){条件为真所执行的流程}else{条件为假......
  • C语言:辗转相除法求最大公约数 函数
    #include<stdio.h>//求最大公约数:辗转相除法:辗转相除法是求两个自然数的最大公约数的一种方法,也叫欧几里德算法。//319377:319%377=319377%319=58319%58=2958%29=0......
  • C语言:辗转相除法求最大公约数
    #include<stdio.h>//求最大公约数:辗转相除法:辗转相除法是求两个自然数的最大公约数的一种方法,也叫欧几里德算法。//319377:319%377=319377%319=58319%58=2958%29=0......
  • python之第三方库pycurl库:PycURl是一个C语言写的libcurl的python绑定库。libcurl 是一
    ​​https://zhuanlan.zhihu.com/p/163173013​​​去期待陌生,去拥抱惊喜。......
  • C语言:九章算术:更相减损法求最大公约数 函数写法
    #include<stdio.h>//<<九章算术>>更相减损法:可以用来求两个数的最大公约数,即“可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。//以等数约之。///第......
  • C语言:九章算术更相减损法求最大公约数
    #include<stdio.h>//<<九章算术>>更相减损法:可以用来求两个数的最大公约数,即“可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。//以等数约之。///第......
  • 【C语言_2】整型和浮点型数据类型
    一、整型数据类型1、整型数据类型名称及关键词   2、为什么要定义不同的整型类型?   因为不同的数据类型所占用的内存大小是不同的,他们可表示的数据范围也......
  • C语言每日一题——第三天
    第三天完成了给朋友的礼物和自己的小想法,小明觉得这两天的学习非常成功!他决定去开发一个小游戏。在一阵开发之后……他遇到了难题——如何为生成“随机数”?尽管操作系统......
  • C语言进位制
    二进制in%dout无八进制%o%o十进制%d%d十六进制%x%x二进制输出使用函数itoa(intsource,char*des,intradix......