=
pnew这个代码从队列的尾部增加新节点,
然后pq->rear
=
pnew更新队列尾部指针。队列的数据结构形式就是由一个头front指针,一个尾rear指针来表征,items的设计是用空间换时间,涉及队列大小的操作会非常方便。
队列的特征是先进先出,你给出的链式实现,其实就跟一个链表一样,链表的添加删除如果能理解了,队列只是链表的元素增加/删除
按先进先出特点的一种实现。
但对于队列来说,实现方式不是重点,先进先出的性质才是重点,这在实际应用中很多,比如排队叫号。
这样的话应该符合你的要求:
#include<stdio.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=1i<=ni++)//输入n个元素
{
add(queue,i)//将i加入队列
}
//验证加入队列的元素,将队列中的元素按照输入的顺序输出:
for( i=1i<=ni++)
{
printf("%d ",Top(queue))//Top函数返回队头元素
del(queue)//删除队头元素
}
//验证输出已经出队列后的队列(数组)元素:
printf("\n")
for(i=1i<=ni++)
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=2i<=endi++)
{
queue[i-1]=queue[i]
}
queue[end]=0//将删除后的地方置0
end--
}
/***************//* 链式队列*/
/***************/
#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 pint 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=ep->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 Qint iElemType x
InitQueue(&Q)
for(i=1i<=ni++)
EnQueue(&Q,i)
while (!QueueEmpty(Q))
{ for(i=1i<=3i++)
{ DeQueue(&Q,&x)
if (i!=3)
EnQueue(&Q,x)
else
printf("%5d",x)
}
}
}
/* 主函数 */
main()
{ LinkQueue Qint iElemType x
InitQueue(&Q)
for(i=2i<=5i++)
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.rear<Q.front) Q.rear=Q.rear+N
for(i=Q.fronti<Q.reari++)
printf("%d\t",Q.base[i%N])}
/* 主函数 */
main()
{ SqQueue Qint iElemType x
InitQueue(&Q)
for(i=2i<=5i++)
EnQueue(&Q,i)
printf("len:%d\n",QueueLength(Q))
while (!QueueEmpty(Q))
{ DeQueue(&Q,&x)
printf("%d\t",x)}
QueueTraverse(Q)
}
在给你个循环队列吧