1.创建一个队列时,空队列中队首和队尾相同,但不是NULL,队首后面挂的元素才是NULL
2.打印队列时,对于链队列,不能把指针加一来找到下一个数据,因为链表地址不连续,需要复制一条链表,不断往后遍历来挨个打印链表的数据
3.求队伍的长度也是,不能首尾指针相减,因为地址不连续,所以同样需要复制一条链表,通过遍历来求长度
代码如下:
#include<stdlib.h> #include<stdio.h> /************************************* * 出队列操作 * 队首(头指针)---元素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<len ; 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<len ; i++) { printf("%c" , p->date); p = p->next; } putchar('\n'); return 0; }