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);
              }

    }
}


在這裏插入圖片描述

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