问题截图,明明已经通过InitializeQueue初始化了pq—>rear,不知道为什么。
完整代码段
#ifndef _QUEUE_H_
#define _QUEUE_H_
#include<stdbool.h>
typedef int Item;
#define MAXQUEUE 10
typedef struct node
{
Item item;
struct node* next;
} Node;
typedef struct queue
{
Node* front;
Node* rear;
int items;
} Queue;
/*操作 初始化队列*/
/*前置条件: pq指向一个队列*/
/*后置条件: 队列被初始化为空*/
void InitializeQueue(Queue* pq);
/*操作 检验队列是否已满*/
/*前置条件: pq指向之前已被初始化的队列*/
/*后置条件: 队列已满返回true,否则返回false*/
bool QueueIsFull(const Queue* pq);
/*操作 检验队列是否为空*/
/*前提条件: pq指向之前被初始化的队列*/
/*后置条件: 队列为空返回true,否则返回false*/
bool QueueIsEmpty(const Queue* pq);
/*操作: 确定队列中的项数*/
/*前提条件: pq指向之前被初始化的队列*/
/*后置条件: 返回队列中的项数*/
int QueueItemCount(const Queue* pq);
/*操作: 在队列末尾添加项*/
/*前提条件: pq指向之前被初始化的队列*/
/* item是要被添加在队列末尾的项*/
/*后置条件: 若队列不为空,item会被添加在队列末尾*/
/* 函数返回true,否则返回false*/
bool EnQueue(Item item, Queue* pq);
/*操作: 从队列开头删除项*/
/*前提条件: pq指向之前被初始化的队列*/
/*后置条件: 如果队列不为空,队列首段的item将被拷贝到*pitem */
/* 并被删除,返回true; */
/* 如果该操作使队列为空,则重置队列为空 */
/* 如果队列在操作前已经为空,则返回false */
bool DeQueue(Item* pitem, Queue* pq);
/*操作: 清空队列*/
/*前提条件: pq指向之前被初始化的队列*/
/*后置条件: 队列被清空*/
void EmptyTheQueue(Queue* pq);
#endif
#include <stdio.h>
#include<stdlib.h>
#include"queue.h"
static void CopyToNode(Item item, Node* pn);
static void CopyToItem(Node* pn, Item* pi);
void InitializeQueue(Queue* pq)
{
pq->front = pq->rear= NULL;
pq->front = 0;
}
bool QueueIsFull(const Queue* pq)
{
return pq->items == MAXQUEUE;
}
bool QueueIsEmpty(const Queue* pq)
{
return pq->items == 0;
}
int QueueItemCount(const Queue* pq)
{
return pq->items;
}
bool EnQueue(Item item, Queue* pq)
{
Node* pnew=NULL;
if (QueueIsFull(pq))
return false;
pnew = (Node*)malloc(sizeof(Node));
if (pnew == NULL)
{
fprintf(stderr, "Unable to allocate memory!\n");
exit(1);
}
CopyToNode(item,pnew);
pnew->next = NULL;
if (QueueIsEmpty(pq))
pq->front = pnew;
else
pq->rear->next = pnew;
pq->rear = pnew;
pq->items++;
return true;
}
bool DeQueue(Item* pitem, Queue* pq)
{
Node* pt;
if (QueueIsEmpty(pq))
return false;
CopyToItem(pq->front, pitem);
pt = pq->front;
pq->front = pq->front->next;
free(pt);
pq->items--;
if (pq->items == 0)
pq->rear = NULL;
return true;
}
void EmptyTheQueue(Queue* pq)
{
Item dummy;
while (!QueueIsEmpty(pq))
DeQueue(&dummy, pq);
}
static void CopyToNode(Item item, Node* pn)
{
pn->item = item;
}
static void CopyToItem(Node* pn, Item* pi)
{
*pi = pn->item;
}
#include<stdio.h>
#include"queue.h"
int main(void)
{
Queue line;
Item temp;
char ch;
InitializeQueue(&line);
puts("Testing the Queue interface.Type a to add a value,");
puts("type d to delete a value,and type q to quit.");
while ((ch = getchar()) != 'q')
{
if (ch != 'a' && ch != 'd')
continue;
if (ch == 'a')
{
printf("Integer to add:");
scanf_s("%d", &temp);
if (!QueueIsFull(&line))
{
printf("Putting %d into queue\n", temp);
EnQueue(temp, &line);
}
else
puts("Nothing to delete!");
}
else
{
if (QueueIsEmpty(&line))
puts("Nothing to delete");
else
{
DeQueue(&temp, &line);
printf("Removing %d from queue\n", temp);
}
}
printf("%d items in queue\n", QueueItemCount(&line));
puts("Type a to add,d to delete,q to quit");
}
EmptyTheQueue(&line);
puts("Bye!");
return 0;
}
你的初始化函数把pq->rear初始化成NULL了,也就是说pq->rear是空的,既然是空的,也就不存在pq->rear->next。初始化函数改成
void InitializeQueue(Queue* pq)
{
pq->front = NULL;
pq->front = 0;
Node* rear = (Node*)malloc(sizeof(Node));
pq->rear=rear;
}
你初始化的是null哦,pq->rear是空值,做一下处理。
您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632
非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!
速戳参与调研>>>https://t.csdnimg.cn/Kf0y