• C语言数据结构链栈(创建、入栈、出栈、取栈顶元素、遍历链栈中的元素)


    /*
    *创建链栈
    *创建一个top指针代表head指针
    *采用链式存储结构
    *采用头插法创建链表
    *操作 创建 出栈 入栈 取栈顶元素
    *创建数据域的结构体
    *创建数据域的名称指针
    *使用随机函数对数据域的编号进行赋值
    */

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<time.h>
    #define OK 1
    #define ERROR 0
    #define NAMESIZE 255//字符串的最大长度
    int count=0;//链栈中数据元素的个数
    typedef int IdType;//数据域的数据类型
    typedef char *NameType;//数据域名称的数据类型
    typedef int Statu;//函数返回值的数据类型
    typedef struct elementtype
    {
    IdType id;
    NameType name;//数据域的名称的指针
    }ElementType;
    typedef struct linkstack
    {
    ElementType *data;//数据域指针
    struct linkstack *next;//指向下一个节点的指针


    }Link_Stack;//链栈的结构体
    Statu create_linkstack(Link_Stack *top);//链栈的创建
    void Init_linkstack(Link_Stack *top);//链栈的初始化
    Statu push_linkstack(Link_Stack *top,ElementType key);//入栈
    Statu pop_linkstack(Link_Stack *top,ElementType *key);//出栈
    Statu getdata_linkstack(Link_Stack*top,ElementType *data);//取栈顶元素
    Statu empty_linkstack(Link_Stack*top);//判断栈是否为空
    void Display_linkstack(Link_Stack *top);//遍历栈中的数据
    void main()
    {
    Link_Stack *top;
    ElementType data;//入栈的数据
    ElementType data1;//出栈的元素
    ElementType key;//取栈顶元素
    top=(Link_Stack*)malloc(sizeof(Link_Stack));
    //对链栈进行初始化
    Init_linkstack(top);
    int result=create_linkstack(top);
    if(result==ERROR)
    {
    printf("链栈创建失败 ");
    }
    else
    {
    printf("链栈创建成功 ");
    printf("链栈中数据元素的个数为:%d ",count);

    }
    if(empty_linkstack(top))
    printf("链栈为空 ");
    else
    printf("链栈不为空 ");
    data.name=(NameType)malloc(sizeof(char)*NAMESIZE);
    data.id=rand()%50;
    printf("请输入入栈的数据的名称:");
    scanf("%s",data.name);
    int result1=push_linkstack(top,data);
    if(result1==ERROR)
    printf("入栈失败 ");
    else
    printf("入栈成功 ");
    data1.name=(NameType)malloc(sizeof(char)*NAMESIZE);
    int result2=pop_linkstack(top,&data1);
    if(result2==ERROR)
    {
    printf("出栈失败 ");
    }
    else
    {
    printf("出栈成功 ");
    printf("出栈的元素为[%s,%d] ",data1.name,data1.id);
    }
    key.name=(NameType)malloc(sizeof(char)*NAMESIZE);
    int result3=getdata_linkstack(top,&key);
    if(result3==ERROR)
    printf("取栈顶元素失败 ");
    else
    {
    printf("取栈顶元素成功 ");
    printf(" 栈顶元素为:[%s,%d] ",key.name,key.id);
    }
    printf("栈中数据遍历的结果为 ");
    Display_linkstack(top);
    }
    void Init_linkstack(Link_Stack*top)//链栈的初始化
    {
    if(top==NULL)
    {
    printf("链栈初始化失败 ");
    return ;
    }
    else
    {
    top->next=NULL;
    }
    }
    Statu create_linkstack(Link_Stack *top)//链栈的创建
    {
    if(top==NULL)
    return ERROR;
    Link_Stack *s;
    char name[NAMESIZE];
    s=(Link_Stack*)malloc(sizeof(Link_Stack));
    if(s==NULL)
    return NULL;
    printf("请输入数据域的名称: ");
    while(scanf("%s",name)!=EOF)
    {
    if(strcmp(name,"^")==0)
    break;
    else if(s==NULL)
    break;
    else
    {

    s->data=(ElementType*)malloc(sizeof(ElementType));
    s->data->name=(NameType)malloc(sizeof(char)*NAMESIZE);
    strcpy(s->data->name,name);
    s->data->id=rand()%30;//data为数据域指针 所以全部使用箭头指向
    s->next=top->next;
    top->next=s;
    count++;//数据元素++
    }
    s=(Link_Stack*)malloc(sizeof(Link_Stack));
    }
    return OK;
    }
    Statu empty_linkstack(Link_Stack*top)//判断栈是否为空
    {
    if(top->next==NULL)
    {
    return OK;
    }
    else
    {
    return ERROR;
    }
    }
    Statu push_linkstack(Link_Stack *top,ElementType key)//入栈
    {
    if(top==NULL)
    return ERROR;
    Link_Stack *s;
    s=(Link_Stack*)malloc(sizeof(Link_Stack));
    s->data=(ElementType*)malloc(sizeof(ElementType));
    s->data->name=(NameType)malloc(sizeof(char)*NAMESIZE);
    s->data->id=key.id;
    strcpy(s->data->name,key.name);
    s->next=top->next;
    top->next=s;
    return OK;

    }
    Statu pop_linkstack(Link_Stack *top,ElementType *key)//出栈
    {
    Link_Stack*node;
    if(empty_linkstack(top))
    {
    return ERROR;
    }
    else
    {
    node=top->next;
    key->id=node->data->id;
    strcpy(key->name,node->data->name);
    top->next=node->next;
    free(node);//释放其内存
    }
    }
    Statu getdata_linkstack(Link_Stack*top,ElementType *data)//取栈顶元素
    {
    //取栈顶元素
    if(empty_linkstack(top))
    return ERROR;
    else
    {
    Link_Stack*node;
    node=top->next;
    data->id=node->data->id;
    strcpy(data->name,node->data->name);
    return OK;

    }
    }
    void Display_linkstack(Link_Stack *top)//遍历栈中的数据
    {
    ElementType data;//出栈的数据

    //对栈进行判断是否为空
    if(empty_linkstack(top))
    return ;
    else
    { while(empty_linkstack(top)!=1)
    {
    data.name=(NameType)malloc(sizeof(char)*NAMESIZE);
    if(pop_linkstack(top,&data))
    printf("[%s,%d] ",data.name,data.id);
    }

    }
    }

  • 相关阅读:
    Elasticsearch集群使用ik分词器
    ES Docs-3:Modifying Data
    ES Docs-2:Exploring ES cluster
    ES Docs-1:Installation Elasticsearch-2.3.1
    Ubuntu的apt-get本地源搭配——根据需要自己添加软件作源
    Linux中Root用户密码变更、密码忘记
    Eclipse安装SVN插件
    【转】Subversion快速入门教程-动画演示
    【转】‘svn’不是内部或外部命令,也不是可运行的程序
    pt-summary pt-mysql-summary工具
  • 原文地址:https://www.cnblogs.com/ly570/p/11069914.html
Copyright © 2020-2023  润新知