• C语言实现数据结构中的链栈


    实现方式一
    # include <stdio.h>
    # include <stdlib.h>
    typedef char NodeData;
    //链栈
    typedef struct Node
    {
     NodeData data;
     struct Node *next;
    }StackNode;
    typedef struct
    {
     StackNode *top;
    }
    LinkStack;

    /*置栈空*/
    void initStack(LinkStack *ls)
    {
     ls->top=NULL;
    }
    /*判栈空*/
    int isStackEmpty(LinkStack *ls)
    {
     return ls->top==NULL;
    }
    /*进栈*/
    void pushStack(LinkStack *ls,NodeData nodedata)
    {
     StackNode *p;
     p=(StackNode *)malloc(sizeof(StackNode));
     p->data=nodedata;
     p->next=ls->top;
     ls->top=p;
    }
    /*出栈*/
    NodeData popStack(LinkStack *ls)
    {
     StackNode *p=ls->top;
     NodeData popNode=ls->top->data;
     ls->top=ls->top->next;
     free(p);
     return popNode;
    }

    /*打印栈*/
    void printStack(LinkStack *ls)
    {
        int i=0;
     StackNode *node;
     node=ls->top;
     while(node->next!=NULL)
     {
      node=node->next;
      printf("LinkStack Node %d is %c/n",i,node->data);
      i++;
     }
    }

    void main()
    {
     LinkStack *ls;
     char inData;
     ls=(LinkStack *)malloc(sizeof(LinkStack));
     initStack(ls);
     //入栈
        printf("Please input data/n");
        while(inData!='/n')
        {
       scanf("%c",&inData);
       pushStack(ls,inData);
       printf("push %c to stack/n",inData);
        }
     printf("print linkStack:/n");
     //打印栈元素
        printStack(ls);
     printf("pop stack/n");
     //出栈
     popStack(ls);
     printStack(ls);
     printf("pop stack/n");
     //出栈
     popStack(ls);
     printStack(ls);

    实现方式二
    只定义了栈节点
    # include <stdio.h>
    # include <stdlib.h>

    typedef char NodeData; //节点数据
    typedef struct Node
    {
     NodeData data;//节点数据
     struct Node * next;  //指向下一个节点的指针
    }StackNode;

    /*置栈空*/
    StackNode * initStack(StackNode *top)
    {
     top=NULL;
     return top;
    }
    /*入栈 (这里很容易出错,需要返回头接点的指针否则每次入参都是指向同一个接点的地址而不是头指针的地址)*/
    StackNode * pushStack(StackNode *top,NodeData nodedata)
    {
     StackNode *p;
     p=(StackNode *)malloc(sizeof(StackNode));
     p->data=nodedata;
     p->next=top;
     top=p;
     return top;
    }

    /*打印栈*/
    void printStack(StackNode *top)
    {
        int i=0;
     StackNode *node;
     node=top;
     while(node->next!=NULL)
     {
      node=node->next;
      printf("LinkStack Node %d is %c/n",i,node->data);
      i++;
     }
    }

    void main()
    {
     StackNode *top;
     NodeData inData;
     top=(StackNode *)malloc(sizeof(StackNode));
     top=initStack(top);
     printf("Please input data/n");
     while(inData!='/n')
     {
      scanf("%c",&inData);
      top=pushStack(top,inData);
      printf("push the %c to stack/n",inData);
     }
     printStack(top);
    }

    实现方式一 中LinkStack结构类型的定义是为了方便在函数体中修改top指针本身
    通过修改指向LinkStack的top指针来控制入栈和出栈.

    实现方式二 通过每次修改头指针并返回给入参来控制入栈和出栈.

    方式一是通过指针参数修改指针所指内容的典型用法.
    方式二是通过函数返回值改变入参内容的典型用法。

  • 相关阅读:
    servlet生命周期总结
    两周找工作有感
    PowerBuilder中新建PBL
    oracle navicat 可视化操作进行数据的修改
    oracle for update for update nowait
    表中字段为关键字,查询字段加引号
    愿你
    oracle安装注意
    随笔
    JeeSite功能模块解读,功能介绍,功能实现
  • 原文地址:https://www.cnblogs.com/xiejava/p/15171483.html
Copyright © 2020-2023  润新知