c语言队列操作

Python018

c语言队列操作,第1张

pq->rear->next

=

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)

}

在给你个循环队列吧