1.创建一个队列时,空队列中队首和队尾相同,但不是NULL,队首后面挂的元素才是NULL
2.打印队列时,对于链队列,不能把指针加一来找到下一个数据,因为链表地址不连续,需要复制一条链表,不断往后遍历来挨个打印链表的数据
3.求队伍的长度也是,不能首尾指针相减,因为地址不连续,所以同样需要复制一条链表,通过遍历来求长度
代码如下:
#include
#include
/*************************************
* 出队列操作
* 队首(头指针)---元素1----元素2---元素3---.....
* 将队首指向元素2,释放掉元素1
* 注意1:队列原本为空队列,直接返回
* 注意2:释放掉第一个元素后,队列变为空队列,别忘了让队尾 = 队首
* ***************************************************************/
//typedef char ElemType;
typedef struct QNode
{
char date;
struct QNode *next;
}QNode , *QueuePtr;
typedef struct
{
QueuePtr front , rear;
}LinkQueue;
/
//创建一个队列
void initQueue(LinkQueue *q)
{
q->front = q->rear = (QueuePtr)malloc(sizeof(QNode));
if (!q->front)
{
exit(0);
}
q->front->next = NULL;//这时头结点后面连接的是NULL,但本身不是NULL
}
/
//入队列操作
void EnQueue(LinkQueue *q , char e)
{
QueuePtr p;
p = (QueuePtr)malloc(sizeof(QNode));
if (!q->front)
{
exit(0);
}
p->date = e;
p->next = NULL;
q->rear->next = p;
q->rear = p;
}
//出队列操作
void DeQueue(LinkQueue *q , char *e)
{
if (q->front == q->rear)//判断是否为空队列
{
return;
}
QueuePtr p;
p = q->front->next;
*e = p->date;
q->front->next = p->next;
if (q->rear == p)
{
q->front = q->rear;
}
free(p);
}
/
//计算队列长度
int LenLinkQueue(LinkQueue *q)
{
int len,i;
QueuePtr p = q->front->next;
for (i = 0; p!=NULL;i++)
{
p = p->next;
}
return i;
}
int main()
{
LinkQueue q;
char e;
//创建队列
initQueue(&q);
printf("队列创建中,请稍后...n队列创建成功!n");
//入队列操作
printf("请输入要插入队列的字符:");
while ((e = getchar())!= ‘n‘)
{
if (e!=‘n‘)
{
EnQueue(&q , e);
}
}
//打印队列
printf("插入成功,正在打印队列字符...n");
printf("当前队列为:");
int len = LenLinkQueue(&q);//队伍长度
QueuePtr p = q.front->next;//链表不同于顺序表,地址不连续,所以不能通过指针的增减来打印,需要复制一个链表遍历
for (size_t i = 0;i
{
printf("%c" , p->date);
p = p->next;
}
putchar(‘n‘);
//出队伍
printf("请输入需要几个元素从队首出队列:");
int n;
scanf("%d",&n);
while (n)
{
DeQueue(&q , &e);
printf("%c已从队首出队列n" ,e);
n--;
}
//打印队伍
printf("插入成功,正在打印队列字符...n");
printf("当前队列为:");
p = q.front->next;
for (size_t i = 0;i
{
printf("%c" , p->date);
p = p->next;
}
putchar(‘n‘);
return 0;
}
运行结果:
原文链接:https://www.cnblogs.com/jerryleesir/p/13339458.html
本文来自网络,不代表手讯网立场。