#include<stdio.h>
#include<stdlib.h>
typedef struct Qnode{
int data;
struct Qnode *next;
}Qnode,*Queueptr;
typedef struct{
Queueptr front; //front是指针类型
Queueptr rear;
}linkqueue;
int initqueue (linkqueue &q)
{
q.front=(Queueptr)malloc(sizeof(Qnode));//此处为分配内存空间
q.rear=(Queueptr)malloc(sizeof(Qnode));
q.front->next=q.rear->next=NULL;//此处为定义
if(!q.front)printf("分配内存失败!\n");
if(q.front==NULL)return -1;
return 0;
}
int inqueue(linkqueue &q)
{
Queueptr r;
int temp=0,i=1;
printf("请输入你的数据,以99结束输入:\n");
while(temp!=99)
{
scanf("%d",&temp);
if(temp==99)
break;
r=(Queueptr)malloc(sizeof(Qnode));
r->data=temp;
r->next=NULL;
r->next=q.front->next;//q.rear 哪里去了
q.front->next=r;
i++;
if(i==1)
{
q.rear=r;//这里q.rear的指向有问题
}
}
return 0;
}
int dequeue(linkqueue &q)//取出栈顶元素,根据用户的需要去多少个元素,并做出异常处理
{ //先算出队列中有多少个元素
int i=0,temp,e=0;
Queueptr r,t,s;
t=q.front->next;//t此时指向队列尾部
if(q.front->next==NULL)
{
printf("error\n");
return 0;
}
printf("test1\n");
while(t!=NULL){//顺便利用这个语句块实现队列元素个数计数的功能 ,根本就达不到这个终止条件
t=t->next;
e++;
}//退出此循环表示到了尾结点,并且保存了上一个结点
printf("队列中共有%d个元素 \n",e);//这里输出一直为1个元素,应该是前面的初始化部分初问题了。
printf("请输入你要取出多少个元素\n");
scanf("%d",&temp);
while(i<temp){//顺便利用这个语句块实现队列元素个数计数的功能
t=q.front->next->next;
s=q.front->next;
if(t==NULL)
printf("now t==null\n");
while(t!=NULL)
{
r=s;
s=t;
t=t->next;//以t为最终结束标志
if(t==NULL)
{
printf("t==null\n");
break;
}
}
printf("%d \n",s->data);
r->next=NULL; //s=NUll有用吗,目前几个均只能取队头重复元素 ,这里并不是S所指向的那个元素变成了NULL
i++;
}
return 0;
}
int main()
{
int a,b,i,j,temp;
linkqueue s,p,q;
Queueptr r,t;
initqueue(s);//为什么这里不是&s
i=initqueue(s);
if(1==1)
printf("分配队列内存成功\n");
inqueue(s);
dequeue(s);//前面的每次对队列的操作结束后。s.front 是保持不变的,类似于标记头结点,变的只有s.rear,故这也是为什么队列要有两个首尾表示结点唯一确定的原因
return 0;
}