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("链栈创建失败\n");
    }
    else
    {
        printf("链栈创建成功\n");
        printf("链栈中数据元素的个数为:%d\n",count);

    }
      if(empty_linkstack(top))
        printf("链栈为空\n");
        else
            printf("链栈不为空\n");
            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("入栈失败\n");
            else
               printf("入栈成功\n");
               data1.name=(NameType)malloc(sizeof(char)*NAMESIZE);
               int result2=pop_linkstack(top,&data1);
               if(result2==ERROR)
               {
                   printf("出栈失败\n");
               }
               else
               {
                   printf("出栈成功\n");
                    printf("出栈的元素为[%s,%d]\n",data1.name,data1.id);
               }
               key.name=(NameType)malloc(sizeof(char)*NAMESIZE);
              int result3=getdata_linkstack(top,&key);
                if(result3==ERROR)
                    printf("取栈顶元素失败\n");
                else
                   {
                       printf("取栈顶元素成功\n");
                       printf(" 栈顶元素为:[%s,%d]\n",key.name,key.id);
                   }
                   printf("栈中数据遍历的结果为\n");
                      Display_linkstack(top);
}
void Init_linkstack(Link_Stack*top)//链栈的初始化
{
    if(top==NULL)
    {
        printf("链栈初始化失败\n");
        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("请输入数据域的名称:\n");
        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]\t",data.name,data.id);
              }

    }
}


在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章