C语言数据结构链队列(创建、入队、出队、取对头元素、遍历)

/*
*链队列的相关操作
*创建一个rear和front指针的结构体
*创建一个链表的结构体
*初始化时rear和front指向head指针
*采用尾插法创建链表
*操作 (初始化、创建、入队 、出队、取对头元素、遍历)
*/

#include
#include
#include
#include
#define NAMESIZE 255//字符串的最大长度
#define OK 1
#define ERROR 0
int count =0;//记录队列元素的个数
typedef int IdTYpe;//数据域的编号的数据类型
typedef char* NameType;//数据域的名称的指针的数据类型
typedef  int Statu;//函数点的返回值数据类型
typedef struct elementtype
{
    IdTYpe id;//数据域的编号
    NameType name;//数据域的名称
}ElementType;//数据域的结构体
typedef struct linknode
{
    ElementType data;//链队列的数据域
    struct linknode *next;//指向下一个节点的指针

}Link_Node;//链表的结构体
typedef struct linkqueue
{
    Link_Node *rear;
    Link_Node *front;//头指针和尾指针

}Link_Queue;//链栈的指针域结构体

void INit_linkqueue(Link_Node*head,Link_Queue*q);//链队列的初始化
Statu create_linkqueue(Link_Queue*q);//链队列的创建
Statu pop_linkqueue(Link_Queue*q,ElementType *data);//出队
Statu push_linkqueue(Link_Queue*q,ElementType data);//入队
Statu getdata_linkqueue(Link_Queue*q,ElementType*data);//取对头元素
Statu empty_linkqueue(Link_Queue*q);//判断对列是否为空
void Display_linkqueue(Link_Queue*q);//遍历队列的元素
void main()
{
    Link_Node*head;//链表的头指针
    ElementType data;//入队元素
    ElementType key;//出队的元素
    ElementType data1;//取对头元素
    head=(Link_Node*)malloc(sizeof(Link_Node));
    Link_Queue*q;
    q=(Link_Queue*)malloc(sizeof(Link_Queue));
    if(head!=NULL&&q!=NULL)
        //对其进行初始化
        INit_linkqueue(head,q);
        //对其进行创建
        int result=create_linkqueue(q);
        if(result==ERROR)
            printf("队列创建失败\n");
          else
          {
              printf("队列创建成功\n");
              printf("队列的元素的个数为%d\n",count);
          }
          if(empty_linkqueue(q))
          printf("队列为空\n");
            else
                 printf("队列不为空\n");
                  printf("请输入要入队元素的名称\n");
                 data.name=(NameType)malloc(sizeof(char)*NAMESIZE);
                  scanf("%s",data.name);
                  data.id=rand()%50;//产生随机数字
                  int result1=push_linkqueue(q,data);
                  if(result1==OK)
                     printf("入队成功\n");
                  else
                     printf("入队失败\n");
                     data1.name=(NameType)malloc(sizeof(char)*NAMESIZE);
                      int result2=getdata_linkqueue(q,&data1);
                        if(result2==ERROR)
                            printf("取对头元素失败\n");
                             else
                             {
                                 printf("取对头元素成功\n");
                                 printf("对头元素为[%d,%s]\n",data1.id,data1.name);
                             }
                     key.name=(NameType)malloc(sizeof(char)*NAMESIZE);
                     int  result3=pop_linkqueue(q,&key);
                     if(result3==ERROR)
                          printf("出队失败\n");
                       else
                       {
                           printf("出队成功\n");
                             printf("出队的元素为[%d,%s]\n",key.id,key.name);
                       }
                       printf("队列元素的遍历的结果为\n");
                         Display_linkqueue(q);

}
void INit_linkqueue(Link_Node*head,Link_Queue*q)//链队列的初始化
{

    q->front=head;
    q->rear=head;//对指针进行初始化
}
Statu create_linkqueue(Link_Queue*q)//链队列的创建
{
    if(q->front==NULL||q->rear==NULL)
        return ERROR;
    Link_Node *s;//循环创建的链表节点
    char name[NAMESIZE];
    printf("请输入数据域的名称\n");
        while(scanf("%s",name)!=EOF)
        {
            if(strcmp(name,"^")==0)
                break;
             else
             {
                 s=(Link_Node*)malloc(sizeof(Link_Node));
                 s->data.name=(NameType)malloc(sizeof(char)*NAMESIZE);
                 s->data.id=rand()%50;//随机函数
                 strcpy(s->data.name,name);//字符串的赋值
                 q->rear->next=s;
                 q->rear=s;
                 s->next=NULL;// 最后一个节点的next指针为空
                 count++;//队列节点的计数
            }
        }
    return OK;
}
Statu empty_linkqueue(Link_Queue*q)//判断对列是否为空
{
    if(q->rear==q->front)
         return OK;
    else
        return ERROR;
}
Statu push_linkqueue(Link_Queue*q,ElementType data)//入队
{
    Link_Node *node;
    node=(Link_Node*)malloc(sizeof(Link_Node));
    node->data.name=(NameType)malloc(sizeof(char)*NAMESIZE);
    strcpy(node->data.name,data.name);
    node->data.id=data.id;
    q->rear->next=node;
    q->rear=node;
      node->next=NULL;
       return OK;

}

Statu pop_linkqueue(Link_Queue*q,ElementType *data)//出队
{
    Link_Node*node;
    node=(Link_Node*)malloc(sizeof(Link_Node));
    //出队进行队列的判空
    if(empty_linkqueue(q))
        return ERROR;//队列为空退出函数
        else
        {
            node=q->front->next;
           data->id=node->data.id;
           strcpy(data->name,node->data.name);
            q->front->next=node->next;//将头指针指向下一个节点
               free(node); //释放内存
        }
        return OK;
}
Statu getdata_linkqueue(Link_Queue*q,ElementType*data)//取对头元素
{
    Link_Node*node;
      if(empty_linkqueue(q))
        return ERROR;
    else
    {
        node=q->front->next;
        data->id=node->data.id;
        strcpy(data->name,node->data.name);
        return OK;
    }
}
void Display_linkqueue(Link_Queue*q)
{
    ElementType data;
    //判空
    if(empty_linkqueue(q))
        return ERROR;
    else
    {

        while(empty_linkqueue(q)!=OK)
        {

            data.name=(NameType)malloc(sizeof(char)*NAMESIZE);
             pop_linkqueue(q,&data);
              printf("[%d,%s]\t",data.id,data.name);

        }
    }
}

C语言数据结构链队列(创建、入队、出队、取对头元素、遍历)_第1张图片

你可能感兴趣的:(数据结构,c语言)