/*
*链队列的相关操作
*创建一个rear和front指针的结构体
*创建一个链表的结构体
*初始化时rear和front指向head指针
*采用尾插法创建链表
*操作 (初始化、创建、入队 、出队、取对头元素、遍历)
*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#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);
}
}
}