【求帮助!】单个指针的循环链式队列 出队 和 遍历出错。
/*只有一个指针,指向尾结点的循环链式队列 :队列应是先进先出,但这程序是却是先进后出,而且出队的元素也又问题,应该是指针哪里错了。可是看了很多遍又找不到哪里错了。请各位帮忙看看。下面有我程序的运行结果。请大神帮帮忙,看看到底错哪里了!!!!! */
#include<stdio.h>
#include<conio.h>
#include<malloc.h>
#include<stdlib.h>
#define size 10
typedef struct queue
{
char Queue;
struct queue * next;
} QUEUE ;
void initqueue(QUEUE * sq);//初始化
bool enterqueue(QUEUE * sq,char val);//入队
bool outqueue(QUEUE * sq,char * val);//出队
bool showqueue(QUEUE * sq);//显示队列信息
bool emptyqueue(QUEUE * sq);//判断队列是否为空
int main(void)
{
QUEUE q;
initqueue(&q);//初始化队列
char ch[size],* n,m;
printf("请输入字符串: \n");
gets(ch);
n = ch;
while(*n)
{
enterqueue(&q,*n);//字符串入队
n++;
}
outqueue(&q,&m);//出队
printf("\n");
showqueue(&q);//显示队列元素
getch();
return 0;
}
void initqueue(QUEUE * sq)
{
sq = (QUEUE *)malloc(sizeof(QUEUE));
if(sq == NULL)
exit(-1);
sq->next = sq;
}
bool emptyqueue(QUEUE * sq)
{
if(sq->next == sq)
return true;
else
return false;
}
bool enterqueue(QUEUE * sq,char val)
{
QUEUE * s;
s = (QUEUE *)malloc(sizeof(QUEUE));
if(s == NULL)
return false;
s->Queue = val;
s->next = sq->next;
sq->next = s;
sq = s;
printf("入队成功,入队元素是 %c \n",sq->Queue);
return true;
}
bool outqueue(QUEUE * sq,char * val)
{
QUEUE * r;
if(emptyqueue(sq))
return false;
r = sq->next->next;
if(sq == r)//头结点后只有一个结点的情况
{
sq = r->next;
sq->next = sq;
*val = r->Queue;
printf("出队成功,出队元素是 %c \n",*val);
free(r);
return true;
}
sq->next->next = r->next;
*val = r->Queue;
printf("出队成功,出队元素是 %c \n",*val);
free(r);
return true;
}
bool showqueue(QUEUE * sq)
{
QUEUE * p,* r;
if(emptyqueue(sq))
{
printf("空队列,输出失败!\n");
return false;
}
r = sq->next;
p = r->next;
while(r != p)
{
printf(" %c ",p->Queue);
p = p->next;
}
printf("\n");
return true;
}
/*
程序运行结果:
-----------------------------------------------------------------------------
请输入字符串:
abcdefg
入队成功,入队元素是 a
入队成功,入队元素是 b
入队成功,入队元素是 c
入队成功,入队元素是 d
入队成功,入队元素是 e
入队成功,入队元素是 f
入队成功,入队元素是 g
出队成功,出队元素是 f //出队的元素应该是 a 现在却是 f 。
队列剩余元素:
e d c b a //显示队列元素应该是从 a 开始的,现在却是倒着来了。请各位大神搭救。。。。到底哪里错了。。。
Press any key to continue
-----------------------------------------------------------------------------
*/