• 链栈的基本操作-完整代码和拆开分析


     1 #include <stdio.h>     //增+删+取栈顶+初始化+判空+输出+销毁
     2 #include <stdlib.h>
     3 #include <malloc.h> 
     4 typedef int DataType;
     5 typedef struct Node {
     6     DataType  data;
     7     struct Node *next;
     8 }Node;
     9 
    10 Node * InitStack(Node*top);
    11 Node * Push(Node * top,DataType x);
    12 Node * GetTop(Node*top,DataType *ptr);
    13 Node * Pop(Node * top,DataType * ptr);
    14 void DestoryStack(Node * top);
    15 int Empty(Node * top);
    16 
    17 int main(){
    18     DataType x;
    19     Node * top = InitStack(top);
    20     printf("对15和10执行入栈操作:
    ");
    21     top = Push(top,15);
    22     top = Push(top,10);
    23     top = GetTop(top,&x); 
    24     printf("当前栈顶元素为:%d
    ",x);
    25     top = Pop(top,&x);
    26     printf("执行一次出栈操作,删除元素:%d
    ",x);
    27     top =GetTop(top,&x);
    28     printf("当前栈顶元素为:%d
    ",x);
    29     printf("请输入待入栈元素:");
    30     scanf("%d",&x);
    31     Push(top,x);
    32     if(Empty(top)==1)
    33         printf("栈为空
    ");
    34     else
    35         printf("栈非空
    ");
    36     DestoryStack(top);
    37     return 0;
    38 }
    39 //初始化 
    40 Node * InitStack(Node*top){
    41     top=NULL;      //栈顶置为空 
    42     printf("初始化成功!
    "); 
    43     return top; 
    44 }
    45 //入栈 
    46 Node * Push(Node * top,DataType x){
    47     Node * s = (Node *)malloc(sizeof(Node));  //malloc申请第一个结点,赋给指向该结点的栈顶指针------- * s 
    48     s -> data = x;  //为节点的data属性赋值 
    49     s -> next = top;  //为节点的next指向前一个节点 
    50     top = s; //栈顶指针指向新节点 
    51     printf("%d入栈成功!
    ",x);
    52     return top;
    53 }
    54 Node * GetTop(Node*top,DataType *ptr){
    55     if(top==NULL){            //判断是否是空栈-----栈顶是否为空 
    56         printf("下溢错误,取栈顶失败
    ");
    57         return 0;
    58     }
    59     *ptr = top->data;       //将栈顶Top的data域赋值给*ptr(指针参数*ptr的值会传回主函数)
    60     return top;
    61 }
    62 //销毁 
    63 void DestoryStack(Node * top){
    64     Node * p = top; //声明一个指向待删除节点的指针 ------ * p (防止丢失,后面要手动释放) 
    65     while(top!=NULL){  //只要栈顶不为null就循环 
    66         top = top -> next; //循环下移栈顶Top 
    67         free(p); //释放p 
    68         p = top;  //重复使用指针 * p 进行下一轮循环删除,直至栈顶Top为空 
    69     }
    70 }
    71 //弹栈 
    72 Node * Pop(Node * top,DataType * ptr){
    73     Node * p = top ;  //声明一个指向待删除节点的指针 ------ * p (防止丢失,后面要手动释放) 
    74     if(top==NULL){    //判断是否为空栈 
    75         printf("下溢错误,删除失败
    ");
    76         return 0;
    77     }
    78     * ptr = top->data;  //将待删除节点的data值赋给 * ptr 供给主函数 
    79     top = top->next;  //栈顶Top向栈底移动一位 
    80     free(p);            //手动释放待删除节点 
    81     return top;
    82 }
    83 //判空 
    84 int Empty(Node * top){
    85     if(top==NULL)  //栈顶Top是否为null 
    86         return 1;
    87     else
    88         return 0;
    89 }

    分析都在注释里啦~就不分块说啦~反而觉得注释还可以更好的对应代码,比之前得笔记好一些呢

  • 相关阅读:
    24、C++ Primer 4th 笔记,面向对象编程(2)
    32、C++ Primer 4th 笔记,多重继承与虚函数
    28、C++ Primer 4th 笔记,模板与泛型编程(3)
    jQuery:1.5.4.3,表格变色(单击行,把当行的单选按钮(radio)设为选中状态,并应用当前样式)
    ASP.NET AJAX:Ajax验证(ajax+Handler处理)
    jQuery:1.5.5.2,京东导航(当前默认设置)
    ImageProtect(图片防盗链)
    HTML:1.文本修饰
    jQuery:1.5.5.1,多选择单一条件查询(search)
    jQuery:1.5.4.4,表格变色(单击行,把当行的复选框(checkbox)设为选中状态,并应用当前样式)
  • 原文地址:https://www.cnblogs.com/wy0526/p/11798018.html
Copyright © 2020-2023  润新知