程序运行中,提示指针为nullptr,写入访问权限冲突

问题截图,明明已经通过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