/***************/
为中卫等地区用户提供了全套网页设计制作服务,及中卫网站建设行业解决方案。主营业务为成都网站制作、做网站、外贸营销网站建设、中卫网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!
/* 链式队列 */
/***************/
#include "stdlib.h"
#include "stdio.h"
/* 定义链式队列类型 */
typedef int ElemType;
typedef struct QNode
{ ElemType data;
struct QNode *next;
} QNode, *QueuePtr;
typedef struct
{ QueuePtr front;
QueuePtr rear;
} LinkQueue;
/* 1、初始化链式队列 */
void InitQueue(LinkQueue *Q)
{ Q-front=Q-rear=(QueuePtr)malloc(sizeof(QNode));
if (!(Q-front)) exit(0);
Q-front-next=NULL; }
/* 2、销毁链式队列 */
void DestroyQueue(LinkQueue *Q)
{ while (Q-front)
{ Q-rear=Q-front-next;
free(Q-front);
Q-front=Q-rear; }
}
/* 3、清空链式队列 */
void ClearQueue(LinkQueue *Q)
{ QueuePtr p;
p=Q-front-next;
while (p)
{ Q-front-next=p-next;
free(p); }
Q-rear=Q-front;
}
/* 4、判断空队列 */
int QueueEmpty(LinkQueue Q)
{ if (Q.front==Q.rear)
return 1;
else
return 0; }
/* 5、求链式队列长度 */
int QueueLength(LinkQueue Q)
{ QueuePtr p; int n=0;
p=Q.front;
while (p!=Q.rear)
{ n++; p=p-next; }
return n;
}
/* 6、取队头元素 */
ElemType GetHead(LinkQueue Q)
{ if (Q.front!=Q.rear)
return Q.front-next-data;
}
/* 7、入队列 */
void EnQueue(LinkQueue *Q, ElemType e)
{ QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
if (!p) exit(0);
p-data=e; p-next=NULL;
Q-rear-next=p;
Q-rear=p; }
/* 8、出队列 */
void DeQueue(LinkQueue *Q, ElemType *e)
{ QueuePtr p;
if (Q-front!=Q-rear)
{ p=Q-front-next;
*e=p-data;
Q-front-next=p-next;
if (Q-rear==p) Q-rear=Q-front;
free(p); }
}
/* 9、遍历链式队列并输出元素 */
void QueueTraverse(LinkQueue Q)
{ QueuePtr p;
printf("\nQueue: ");
p=Q.front-next;
while (p)
{ printf("%d\t",p-data);
p=p-next;}
}
/* 约瑟夫问题 */
void Joseffer(int n)
{ LinkQueue Q; int i; ElemType x;
InitQueue(Q);
for(i=1; i=n; i++)
EnQueue(Q,i);
while (!QueueEmpty(Q))
{ for(i=1; i=3; i++)
{ DeQueue(Q,x);
if (i!=3)
EnQueue(Q,x);
else
printf("%5d",x);
}
}
}
/* 主函数 */
main()
{ LinkQueue Q; int i; ElemType x;
InitQueue(Q);
for(i=2; i=5; i++)
EnQueue(Q,i);
printf("len:%d\n",QueueLength(Q));
while (!QueueEmpty(Q))
{ DeQueue(Q,x);
printf("%d\t",x); }
//QueueTraverse(Q);
//Joseffer(6);
}
自己去调试吧,这个是C语言版的链式队列,如果看不懂或者调不出来就去看书吧。否则你这门是白学了。
注:这里是链式队列
/***************/
/* 循环队列 */
/***************/
#include "stdlib.h"
#include "stdio.h"
#define N 100
/* 定义循环队列类型 */
typedef int ElemType;
typedef struct
{ ElemType *base;
int front;
int rear;
} SqQueue;
/* 1、初始化循环队列 */
void InitQueue(SqQueue *Q)
{ Q-base=(ElemType*)malloc(N*sizeof(ElemType));
Q-front=Q-rear=0; }
/* 2、销毁循环队列 */
void DestroyQueue(SqQueue *Q)
{ free(Q-base); }
/* 3、清空循环队列 */
void ClearQueue(SqQueue *Q)
{ Q-front=Q-rear=0; }
/* 4、判断空队列 */
int QueueEmpty(SqQueue Q)
{ if (Q.front==Q.rear)
return 1;
else
return 0; }
/* 5、求循环队列长度 */
int QueueLength(SqQueue Q)
{ return (Q.rear+N-Q.front)%N; }
/* 6、取队头元素 */
void GetHead(SqQueue Q, ElemType *e)
{ if (Q.front!=Q.rear)
*e=Q.base[Q.front];
}
/* 7、入队列 */
int EnQueue(SqQueue *Q, ElemType e)
{ if ((Q-rear+1)%N==Q-front)
return 0;
Q-base[Q-rear]=e;
Q-rear=(Q-rear+1)%N;
return 1; }
/* 8、出队列 */
int DeQueue(SqQueue *Q, ElemType *e)
{ if (Q-front==Q-rear)
return 0;
*e=Q-base[Q-front];
Q-front=(Q-front+1)%N;
return 1; }
/* 9、遍历循环队列并输出元素 */
void QueueTraverse(SqQueue Q)
{ int i;
printf("\nQueue: ");
if (Q.rearQ.front) Q.rear=Q.rear+N;
for(i=Q.front; iQ.rear; i++)
printf("%d\t",Q.base[i%N]); }
/* 主函数 */
main()
{ SqQueue Q; int i; ElemType x;
InitQueue(Q);
for(i=2; i=5; i++)
EnQueue(Q,i);
printf("len:%d\n",QueueLength(Q));
while (!QueueEmpty(Q))
{ DeQueue(Q,x);
printf("%d\t",x); }
QueueTraverse(Q);
}
在给你个循环队列吧
我改了pop函数。
你忘了第一个Q-head 被你指NULL了,而在后面的函数push中你if()中Q-head=Q-prev=current;语句从来没有执行过,所以head一直是指向空的。你可以看看我给你改的调试信息。
#includestdio.h
#includestdlib.h
typedef struct Qnode
{
int data;
struct Qnode * next;
}Qnode;
typedef struct listquene
{
Qnode * head;
Qnode * prev;
}listquene;
void initquene(listquene * Q)
{
Q-prev=Q-head=(Qnode*)malloc(sizeof(Qnode));
if(!Q-head)
{
Q-prev=Q-head=NULL;
}
}
void push(listquene * Q,int e)
{
Qnode * current;
if(!Q-head)
{
current=(Qnode*)malloc(sizeof(Qnode));
current-data=e;
current-next=NULL;
Q-head=Q-prev=current;
printf("$$$$\n");
}
else
{
current=(Qnode*)malloc(sizeof(Qnode));
current-data=e;
current-next=NULL;
Q-prev-next=current;
Q-prev=current;
printf("###\n");
}
}
int pop(listquene * Q)
{
if(!Q-head)
printf("empty quene can't be deleted!"),exit(1);
else
{
int temp;
Qnode * p;
temp=Q-head-next-data;
p=Q-head;
Q-head=p-next;
if(!Q-head)
Q-prev=NULL;
free(p);
p=NULL;
return temp;
}
}
void initquene(listquene *);
void push(listquene *,int );
int pop(listquene *);
int main()
{
int i;
listquene Q;
initquene(Q);
push(Q,1);
push(Q,2);
push(Q,4);
push(Q,8);
printf("%d\n",pop(Q));
printf("%d\n",pop(Q));
printf("%d\n",pop(Q));
printf("%d\n",pop(Q));
return 0;
}
这样的话应该符合你的要求:
#includestdio.h
void add(int queue[],int x);
int Top(int queue[]);
void del(int queue[]);
int end=0;
int main()
{
int n;
scanf("%d",n);//将要入队列n个元素
int queue[1000];
for(int i=1;i=n;i++)//输入n个元素
{
add(queue,i);//将i加入队列
}
//验证加入队列的元素,将队列中的元素按照输入的顺序输出:
for( i=1;i=n;i++)
{
printf("%d ",Top(queue));//Top函数返回队头元素
del(queue);//删除队头元素
}
//验证输出已经出队列后的队列(数组)元素:
printf("\n");
for(i=1;i=n;i++)
printf("%d ",queue[i]);
printf("\n");
return 0;
}
void add(int queue[],int x)
{
queue[++end]=x;
}
int Top(int queue[])
{
return queue[1];//注意,这里的函数始终return queue[1];这里是和将普通数组中的元素输出最大的不同之处。!!!!!!
}
void del(int queue[])
{
for(int i=2;i=end;i++)
{
queue[i-1]=queue[i];
}
queue=0;//将删除后的地方置0
end--;
}