循环队列的遍历问题

xiaoshun007~ 2010-12-14 09:20:03
/*实现循环队列的基本运算*/
/*实现顺序列的基本运算*/
#include <stdio.h>
#define maxsize 20

/*对队列数据类型的说明*/
typedef int elemtype;
typedef struct
{
elemtype queue[maxsize];
int front; //定义头指针
int rear; //定义尾指针
}Sequeue;

/*初始化队列*/
Sequeue Iniqueue ()
{
Sequeue s;
s.front = s.rear = -1; //空对就是头指针等于尾指针
return s;
}

/*进队运算*/
Sequeue enqueue (Sequeue s, elemtype x)
{
/*就是将数据x插入到队尾,注意队列满了的情况*/
if ((s.rear+1)%maxsize == s.front)
printf("队列满了!\n");
else
{
s.rear = (s.rear+1)%maxsize; //先使为指针后移一个位置
s.queue[s.rear] = x; //将x赋给新的队尾元素
}
return s;
}

/*出队运算*/
void dlqueue (Sequeue s)
{
/*删除对首元素,注意队列为空的情况*/
if (s.front = s.rear)
{
printf("空队列!\n"); //判断队列是否为空
}
else
{
s.front = (s.front+1)%maxsize; //使头指针后移一个位置
}
}

/*取队首元素*/
elemtype gethead (Sequeue s)
{
/*仍然要注意队列为空的情况*/
if (s.front = s.rear)
{
printf("空队列!\n"); //判断队列是否为空
}
else
{
return s.queue[(s.front+1)%maxsize];
}
}

/*遍历队列函数,从对头到队尾依次输出队列元素*/
void display (Sequeue s)
{
int i;
/*注意队列为空的情况*/
if (s.front = s.rear)
{
printf("空队列!\n"); //判断队列是否为空
}
else
{
printf("队列遍历(对头->队尾):\n");
for (i = s.front; s.rear != i%maxsize; i=(i+1)%maxsize)
{
printf("%d->", s.queue[i]);
}
printf("\b\b\n");
}
}

void main ()
{
Sequeue s; //定义一个循环队列
int i;

//s = Iniqueue (); //调用初始化队列函数

for (i=1;i<=15;i++)
{
s = enqueue (s, i);
}

/*元素进队后遍历队列*/
display (s);
}
运行不出啊……各位高手帮帮忙啊!!
...全文
745 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
nix_fire 2010-12-19
  • 打赏
  • 举报
回复
什么意思啊
gzb123 2010-12-18
  • 打赏
  • 举报
回复
汗,中文竟然成乱码了,lz自己改回来吧,呵呵
gzb123 2010-12-18
  • 打赏
  • 举报
回复
/*ʵÏÖÑ­»·¶ÓÁеĻù±¾ÔËËã*/
/*ʵÏÖ˳ÐòÁеĻù±¾ÔËËã*/
#include <stdio.h>
#define maxsize 20

/*¶Ô¶ÓÁÐÊý¾ÝÀàÐ͵Ä˵Ã÷*/
typedef int elemtype;
typedef struct
{
elemtype queue[maxsize];
int front; //¶¨ÒåÍ·Ö¸Õë
int rear; //¶¨ÒåβָÕë
}Sequeue;

/*³õʼ»¯¶ÓÁÐ*/
void Iniqueue(Sequeue& s)
{
s.front = s.rear = -1; //¿Õ¶Ô¾ÍÊÇÍ·Ö¸ÕëµÈÓÚβָÕë
}

/*½ø¶ÓÔËËã*/
void enqueue (Sequeue &s, elemtype x)
{
/*¾ÍÊǽ«Êý¾Ýx²åÈëµ½¶Óβ,×¢Òâ¶ÓÁÐÂúÁ˵ÄÇé¿ö*/
if ((s.rear+1)%maxsize == s.front)
printf("¶ÓÁÐÂúÁË£¡\n");
else
{
s.rear = (s.rear+1)%maxsize; //ÏÈʹΪָÕëºóÒÆÒ»¸öλÖÃ
s.queue[s.rear] = x; //½«x¸³¸øеĶÓβԪËØ
}
}

/*³ö¶ÓÔËËã*/
void dlqueue (Sequeue& s)
{
/*ɾ³ý¶ÔÊ×ÔªËØ£¬×¢Òâ¶ÓÁÐΪ¿ÕµÄÇé¿ö*/
if (s.front = s.rear)
{
printf("¿Õ¶ÓÁУ¡\n"); //Åж϶ÓÁÐÊÇ·ñΪ¿Õ
}
else
{
s.front = (s.front+1)%maxsize; //ʹͷָÕëºóÒÆÒ»¸öλÖÃ
}
}

/*È¡¶ÓÊ×ÔªËØ*/
elemtype gethead (Sequeue& s)
{
/*ÈÔȻҪעÒâ¶ÓÁÐΪ¿ÕµÄÇé¿ö*/
if (s.front = s.rear)
{
printf("¿Õ¶ÓÁУ¡\n"); //Åж϶ÓÁÐÊÇ·ñΪ¿Õ
}
else
{
return s.queue[(s.front+1)%maxsize];
}
}

/*±éÀú¶ÓÁк¯Êý£¬´Ó¶ÔÍ·µ½¶ÓβÒÀ´ÎÊä³ö¶ÓÁÐÔªËØ*/
void display (Sequeue& s)
{
int i;
/*×¢Òâ¶ÓÁÐΪ¿ÕµÄÇé¿ö*/
if (s.front == s.rear)
{
printf("¿Õ¶ÓÁÐ!\n"); //Åж϶ÓÁÐÊÇ·ñΪ¿Õ
}
else
{
printf("¶ÓÁбéÀú(¶ÔÍ·->¶Óβ)£º\n");
for (i = s.front+1; s.rear > i%maxsize; i=(i+1)%maxsize)
{
printf("%d->", s.queue[i]);
}
printf("%d\b\b\n",s.queue[i]);
}
}

void main ()
{
Sequeue s; //¶¨ÒåÒ»¸öÑ­»·¶ÓÁÐ
Iniqueue(s);
int i;

//s = Iniqueue (); //µ÷Óóõʼ»¯¶ÓÁк¯Êý

for (i=1;i<=15;i++)
{
enqueue (s, i);
}
display(s);
}
xiaoshun007~ 2010-12-18
  • 打赏
  • 举报
回复
还是有错误啊……!!!!!
Dstnoe 2010-12-14
  • 打赏
  • 举报
回复
下面是我修改以后的:

/*实现循环队列的基本运算*/
/*实现顺序列的基本运算*/
#include <stdio.h>
#define maxsize 20

/*对队列数据类型的说明*/
typedef int elemtype;
typedef struct
{
elemtype queue[maxsize];
int front; //定义头指针
int rear; //定义尾指针
}Sequeue;
Sequeue s;
/*初始化队列*/
Sequeue Iniqueue ()
{

s.front = s.rear = -1; //空对就是头指针等于尾指针
return s;
}

/*进队运算*/
Sequeue enqueue (Sequeue &s, elemtype x)
{
/*就是将数据x插入到队尾,注意队列满了的情况*/
if ((s.rear+1)%maxsize == s.front)
printf("队列满了!\n");
else
{
s.rear = (s.rear+1)%maxsize; //先使为指针后移一个位置
s.queue[s.rear] = x; //将x赋给新的队尾元素
}
return s;
}

/*出队运算*/
void dlqueue (Sequeue &s)
{
/*删除对首元素,注意队列为空的情况*/
//********************************************************
if (s.front == s.rear)// 判断是否相等“==”写成了“=”
//*********************************************************

{
printf("空队列!\n"); //判断队列是否为空
}
else
{
s.front = (s.front+1)%maxsize; //使头指针后移一个位置
}
}

/*取队首元素*/
elemtype gethead (Sequeue &s)
{
/*仍然要注意队列为空的情况*/
if (s.front = s.rear)
{
printf("空队列!\n"); //判断队列是否为空
}
else
{
return s.queue[(s.front+1)%maxsize];
}
}

/*遍历队列函数,从对头到队尾依次输出队列元素*/
void display (Sequeue &s)
{
int i;
/*注意队列为空的情况*/
if (s.front = s.rear)
{
printf("空队列!\n"); //判断队列是否为空
}
else
{
printf("队列遍历(对头->队尾):\n");
for (i = s.front; s.rear != i%maxsize; i=(i+1)%maxsize)
{
printf("%d->", s.queue[i]);
}
printf("\b\b\n");
}
}
int main ()
{
//Sequeue s; //定义一个循环队列
int i;

s = Iniqueue (); //调用初始化队列函数

for (i=1;i<=15;i++)
{
s = enqueue (s, i);
}

/*元素进队后遍历队列*/
display (s);
return 0;
}


还有,s,最好设为全局变量,用指针或引用(C++里的语法)传递给各个函数。 注意值传递和地址传递的区别!
继续努力!! +you!!
cheng_fengming 2010-12-14
  • 打赏
  • 举报
回复
你不打算借助指针或者引用来作为参数吗?
Sequeue enqueue (Sequeue s, elemtype x);
像这个函数形参s是实参s的副本,在这个函数里面对形参的操作并不是引起实参的改变,因为它们是两个变量,但是通过指针的话传递实参的地址的时候,实参和形参实际上指向的是同一块儿内存,这样形参内容改变了实参的内容也就改变了。

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧