100 Days of Code-day10

实现一个链队列,随意输入一串字符,以@为结束标志,然后将队列中的元素逐一取出,打印在屏幕上

#include <stdio.h>
typedef struct QNode
{
	char ch;
	struct QNode *next;
}QNode ,*QueuePtr;
typedef struct
{
	QueuePtr front;
	QueuePtr rear;//队头指针front和队尾指针rear都指向队列元素,也就是都指向struct QNode类型的数据
}LinkQueue;
InitQueue(LinkQueue* PtrQ)
{
	PtrQ->front = PtrQ->rear = NULL;
}
//char DeleteQNode(LinkQueue PtrQ) 该形参的类型是错误的,因为出队列操作需要对队头指针进行修改
//所以形参类型应该是指向LinkQueue类型的指针变量。同理,入队列操作需要将队尾指针指向新插入的空间
char DeleteQNode(LinkQueue* PtrQ)
{
	QueuePtr FrontCell;
	char FrontElement;
	if (PtrQ->front == NULL)
	{
		printf("队列空");
		return -1;
	}
	FrontCell = PtrQ->front;
	if (PtrQ->front == PtrQ->rear)//此时队列中只有一个元素
	{
		PtrQ->front = PtrQ->rear = NULL;
	}
	else
	{
		PtrQ->front = PtrQ->front->next;
	}
	FrontElement = FrontCell->ch;
	free(FrontCell);
	return FrontElement;
}

void AddQNode(LinkQueue* PtrQ,char InsertCh)
{
	QueuePtr RearCell;
	RearCell = (QueuePtr)malloc(sizeof(struct QNode));
	if (!RearCell) return;
	RearCell->ch = InsertCh;
	RearCell->next = NULL;
	if (!PtrQ->front)//队列为空的条件不是PtrQ->front == PtrQ->rear,因为除了初始状态,两者相等
					//当队列只有一个元素时,两者也是相等的(都指向同一个空间)
	{
		PtrQ->front = PtrQ->rear = RearCell;
		return;
	}
	PtrQ->rear->next = RearCell;
	PtrQ->rear = RearCell;
}
void GetHeadPtr(LinkQueue* PtrQ, QueuePtr* HeadPtr)
{
	if (!PtrQ->front) return;//队列为空
	*HeadPtr = PtrQ->front;
}
int main()
{
	char insertC;
	LinkQueue lq;
	QueuePtr head = NULL;
	int i = 1;
	InitQueue(&lq);
	scanf("%c", &insertC);
	AddQNode(&lq, insertC);
	GetHeadPtr(&lq, &head);
	while (1)
	{
		scanf("%c", &insertC);
		if (insertC == '@') break;
		AddQNode(&lq, insertC);
	}
	printf("GetHeadPtr函数得到的结果:%p\n", head);//输出未进行出队操作时front指针所在位置
	printf("未进行出队操作时front指针所在位置:%p\n", lq.front);
	while (lq.front)
	{
		printf("%c\n", DeleteQNode(&lq));
		printf("第%d次出队操作后front指针所在位置:%p\n", i,lq.front);//输出每次进行出队操作后front指针所在位置
		i++;
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值