中国好利鹏的专栏

//3.13 假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素站点(注意不设头指针) ,试编写相应的置空队、判队空 、入队和出队等算法。 //先定义链队结构:#include "stdio.h"#include "stdlib.h"#include "malloc.h"typedef struct queuenode{ int data; struct queuenode *next;}QueueNode;//以上是结点类型的定义typedef struct{ QueueNode *rear;}LinkQueue; //只设一个指向队尾元素的指针//(1)置空队void InitQueue(LinkQueue *Q){//置空队:就是使头结点成为队尾元素 QueueNode *s; s=(QueueNode*)malloc(sizeof(QueueNode)); Q->rear=Q->rear->next;//将队尾指针指向头结点 while(Q->rear!=(Q->rear->next))//当队列非空,将队中元素逐个出队 { s=Q->rear->next; Q->rear->next=s->next; free(s);//回收结点空间 } s=NULL;}//(2)判队空 int EmptyQueue(LinkQueue *Q){//判队空 //当头结点的next指针指向自己时为空队 return Q->rear->next->next==Q->rear->next;}//(3)入队void EnQueue(LinkQueue *Q,int x){//入队 //也就是在尾结点处插入元素 QueueNode *p; p=(QueueNode*)malloc(sizeof(QueueNode));//申请新结点 p->data=x;p->next=Q->rear->next;//初始化新结点并链入 Q->rear->next=p; Q->rear=p;//将尾指针移至新结点}//(4)出队int DeQueue(LinkQueue *Q){//出队,把头结点之后的元素摘下 int x; QueueNode *p; if(EmptyQueue(Q)) printf("Queue underflow"); p=Q->rear->next->next;//p指向将要摘下的结点 x=p->data;//保存结点中数据 if(p==Q->rear) {//当队列中只有一个结点时,p结点出队后,要将队尾指针指向头结点 Q->rear=Q->rear->next;Q->rear->next=p->next; } else Q->rear->next->next=p->next;//摘下结点p free(p);//释放被删结点 return x;}int main(){ LinkQueue *Q; int i,e,n; Q=(LinkQueue*)malloc(sizeof(LinkQueue)); Q->rear->next=(QueueNode*)malloc(sizeof(QueueNode));//这个语句得注意,十分关键,弄了一下午才弄出来 InitQueue(Q); printf("input the number of the data:"); scanf("%d",&n); for(i=0;i<n;i++) { printf("enter the queue:"); scanf("%d",&e); EnQueue(Q,e); } printf("input the number of the datas to out:"); scanf("%d",&n); for(i=0;i<n;i++) { printf("output first data in the queue:"); DeQueue(Q); printf("%d\n",Q->rear->data); } return 0;}

,可以一个人,可以几个人,一起放松那劳累的心情或者劳累自己的身体,

中国好利鹏的专栏

相关文章:

你感兴趣的文章:

标签云: