实现一个链队列,随意输入一串字符,以@为结束标志,然后将队列中的元素逐一取出,打印在屏幕上
#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;
}