/*数据结构-顺序队列的基本操作*/
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define MAXSIZE 10 /*队列的最大容量*/
int in_data,d_data;
typedef struct student /*定义队列的数据结构*/
{
int data[MAXSIZE-1]; /*用来存放数据*/
int front; /*用来指向第一个节点*/
int rear; /*用来指向最后一个节点*/
int count; /*队列中的现有数据元素个数*/
int max; /*队列允许的最多数据元素个数*/
}qnode;
/*创建一个空队列的函数*/
qnode *creat()
{
qnode *p;
p=(qnode *)malloc(sizeof(qnode));
if(!p)printf("error./n");
else
{
p->rear=-1;
p->front=0;
p->count=0;
p->max=MAXSIZE;
}
return(p);
}
/*清空队列queue为空队列的函数*/
int clearqueue(qnode *queue)
{
queue->rear=-1;
queue->front=0;
queue->count=0;
return(1);
}
/*若队列queue为空队列则返回1,否则返回0的函数*/
int queueempty(qnode *queue)
{
if(queue->count==0)
return(1);
}
/*求队列queue的长度的函数*/
int queuelength(qnode *queue)
{
return(queue->count);
}
/*若队列不为空,输出队列queue的队头元素e*/
int gethead(qnode *queue)
{
int e;
if(queue->count=0)printf("The queue is null ./n");
else
{
e=queue->data[queue->front];
}
return(e);
}
/*插入e为队列queue的新的队尾元素----入队*/
qnode *input(qnode *queue,int e)
{
if(queue->count==queue->max)
{printf("The queue is full./n");
exit(1);}
else
{
queue->rear++;
queue->data[queue->rear]=e;
queue->count++;
}
return(queue);
}
/*若队列不为空则用e返回它的队头元素.并删除它----出队*/
int dehead(qnode *queue)
{
if(queue->count==0)
printf("the queue is null./n");
else
return(queue->data[queue->front]);
}
/*若队列不为空,则删除队列queue的尾元素e,并输出*/
int delast(qnode *queue)
{
int e;
if(queue->count=0)printf("The queue is null ./n");
else
{
e=queue->data[queue->rear];
free(&(queue->data[queue->front+1]));/*注意:free后面的括号里面是一个地址,而不能是一个地址里的数据。
所以不能写成free(queue->data[queue->front+1]); */
queue->count--;
queue->rear--;
}
return(e);
}
int main()
{
qnode *a,*b;
int in_data1,in_data2,in_data3,d_data;
printf("begine..../n/n");
printf("creat a null queue./n");
a=creat(); /*调用creat函数*/
/*输入三个数据*/
printf("Input the data: ");
scanf("%d",&in_data1);
b=input(a,in_data1);
printf("Input other data: ");
scanf("%d",&in_data2);
b=input(a,in_data2);
printf("Input other data: ");
scanf("%d",&in_data3);
b=input(a,in_data3);
if(queueempty(b)) /*调用queueempty函数*/
printf("the queue's lenth is: %d/n",queuelength(b)); /*调用queuelength函数*/
printf("delete the queue's head data is: %d/n", dehead(b)); /*调用dehead函数*/
printf("delete the queue's last data is: %d/n", delast(b)); /*调用delast函数*/
return(1);
}
/*还有gethead和clearqueue两个函数没有调用*/
/*
总结:
1.用if判断条件时,如果是判断是否相等,则逻辑符号一定要用"==",不能用成"=".
如: if(queue->count==0)不能写成 if(queue->count=0) .
2.用scanf函数时一定要在变量前加 & 符号.
3.free函数的调用一定要小心.
4.用#define定义的符号若代表一个常数,可以作为一个常量给其他的变量赋值.
5.不能在结构体里直接给结构体里面的变量赋值.
6.free后面的括号里面是一个地址(比如:free(&a)里&a的实际意义其实是一个地址。)
而不能是一个地址里的数据。所以不能写成free(queue->data[queue->front+1]);
*/