鱼C论坛

 找回密码
 立即注册
查看: 1991|回复: 2

[已解决]只带尾指针的循环链队列的入队和出队

[复制链接]
发表于 2023-10-26 18:03:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
. 建立一个仅用尾指针标识的循环链队列,完成以下操作:

1) 根据输入的队列长度 n 和各元素值建立一个带头结点的循环链表表示的队列(循环链队列),并且只设一个尾指针来指向尾结点,然后输出队列中各元素值。

2) 将数据元素 e 入队,并输出入队后的队列中各元素值。

3) 将循环链队列的队首元素出队,并输出出队元素的值和出队后队列中各元素值。
请大佬们帮忙完善这个代码。
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define maxqsize 100
  4. #define OK 1
  5. #define ERROR 0
  6. typedef int status;
  7. typedef int qelemtype;
  8. typedef struct cqnode {
  9.     qelemtype data;      //数据域
  10.     struct cqnode *next; //指针域
  11. }cqnode,*cqlink;
  12. status cqlink_InitQueue (cqlink &rear)//创建一个空的循环链队列rear
  13. {
  14.         rear=(cqnode*)malloc(sizeof(cqnode));
  15.         rear->next=rear;
  16.         return OK;
  17. }
  18. status cqlink_enqueue (cqlink &rear,qelemtype e)//在循环链队列rear中插入新的元素e,使其成为新的队尾元素
  19. {
  20.         cqnode *q;
  21.         q=(cqnode*)malloc(sizeof(cqnode));
  22.         q->data=e;
  23.         q->next=rear->next;
  24.         rear->next=q;
  25.         rear=q;
  26.         return OK;
  27. }
  28. status cqlink_DeQueue (cqlink &rear,qelemtype &e)//在循环链队列rear中删除队首元素,并用e返回其值
  29. {
  30.         cqnode *p=rear->next,*q;
  31.         if(rear==p)return ERROR;
  32.         q=p->next;
  33.         e=q->data;
  34.         if(q==rear) rear=p;
  35.         p->next=q->next;
  36.         free(q);
  37.         return OK;
  38. }
  39. status cqlink_Display(cqlink rear)//从队首到队尾,依次输出链队列中各数据元素的值
  40. {
  41.        
  42. }
  43. int main()
  44. {
  45.         sqqueue q;
  46.         cqlink rear;
  47.         qelemtype e,count,x,c,t;
  48.         int n,i,j,m,z,y,f=1,d,g;
  49.         cqlink_InitQueue(rear);
  50.     printf("请问要入队几次:\n");
  51.         scanf("%d",&d);
  52.         printf("请输入要入队的数:\n");
  53.         for(i=0;i<d;i++)
  54.         {
  55.                 scanf("%d",&e);
  56.                 cqlink_InitQueue(rear);
  57.         }
  58.         printf("请问要出队几次:\n");
  59.         scanf("%d",&g);
  60.         printf("出队的数为:");
  61.         for(j=0;j<g;j++)
  62.         {
  63.                          cqlink_DeQueue(rear,e);
  64.                     printf("%d ",e);
  65.         }
  66.         return 0;
  67. }
复制代码
最佳答案
2023-10-26 18:03:45
下面是完善后的代码:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define maxqsize 100
  4. #define OK 1
  5. #define ERROR 0
  6. typedef int status;
  7. typedef int qelemtype;
  8. typedef struct cqnode {
  9.     qelemtype data;      //数据域
  10.     struct cqnode *next; //指针域
  11. }cqnode,*cqlink;

  12. status cqlink_InitQueue (cqlink &rear)//创建一个空的循环链队列rear
  13. {
  14.     rear=(cqnode*)malloc(sizeof(cqnode));
  15.     rear->next=rear;
  16.     return OK;
  17. }

  18. status cqlink_enqueue (cqlink &rear,qelemtype e)//在循环链队列rear中插入新的元素e,使其成为新的队尾元素
  19. {
  20.     cqnode *q;
  21.     q=(cqnode*)malloc(sizeof(cqnode));
  22.     q->data=e;
  23.     q->next=rear->next;
  24.     rear->next=q;
  25.     rear=q;
  26.     return OK;
  27. }

  28. status cqlink_DeQueue (cqlink &rear,qelemtype &e)//在循环链队列rear中删除队首元素,并用e返回其值
  29. {
  30.     cqnode *p=rear->next,*q;
  31.     if(rear==p) return ERROR;
  32.     q=p->next;
  33.     e=q->data;
  34.     if(q==rear) rear=p;
  35.     p->next=q->next;
  36.     free(q);
  37.     return OK;
  38. }

  39. status cqlink_Display(cqlink rear)//从队首到队尾,依次输出链队列中各数据元素的值
  40. {
  41.     cqnode *p = rear->next->next;
  42.     while (p != rear->next) {
  43.         printf("%d ", p->data);
  44.         p = p->next;
  45.     }
  46.     printf("\n");
  47.     return OK;
  48. }

  49. int main()
  50. {
  51.     cqlink rear;
  52.     qelemtype e;
  53.     int n, i, j, d, g;
  54.    
  55.     cqlink_InitQueue(rear);
  56.     printf("请输入队列长度:\n");
  57.     scanf("%d", &n);
  58.     printf("请输入队列元素值:\n");
  59.     for (i = 0; i < n; i++) {
  60.         scanf("%d", &e);
  61.         cqlink_enqueue(rear, e);
  62.     }
  63.     printf("队列中各元素值为:");
  64.     cqlink_Display(rear);
  65.    
  66.     printf("请输入要入队的数:\n");
  67.     scanf("%d", &d);
  68.     printf("入队后队列中各元素值为:");
  69.     for (i = 0; i < d; i++) {
  70.         scanf("%d", &e);
  71.         cqlink_enqueue(rear, e);
  72.     }
  73.     cqlink_Display(rear);
  74.    
  75.     printf("请输入要出队的次数:\n");
  76.     scanf("%d", &g);
  77.     printf("出队的数为:");
  78.     for (j = 0; j < g; j++) {
  79.         cqlink_DeQueue(rear, e);
  80.         printf("%d ", e);
  81.     }
  82.     printf("\n");
  83.    
  84.     return 0;
  85. }
复制代码


这段代码实现了一个只带尾指针的循环链队列,并完成了入队和出队的操作。在主函数中,首先通过 cqlink_InitQueue 函数创建了一个空的循环链队列,并根据输入的队列长度和元素值,使用 cqlink_enqueue 函数将元素依次入队,并使用 cqlink_Display 函数输出队列中各元素值。接下来,根据输入的入队次数,使用 cqlink_enqueue 函数将元素入队,并再次使用 cqlink_Display 函数输出入队后的队列中各元素值。最后,根据输入的出队次数,使用 cqlink_DeQueue 函数将队首元素出队,并输出出队元素的值。

希望可以帮到你!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-10-26 18:03:45 | 显示全部楼层    本楼为最佳答案   
下面是完善后的代码:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define maxqsize 100
  4. #define OK 1
  5. #define ERROR 0
  6. typedef int status;
  7. typedef int qelemtype;
  8. typedef struct cqnode {
  9.     qelemtype data;      //数据域
  10.     struct cqnode *next; //指针域
  11. }cqnode,*cqlink;

  12. status cqlink_InitQueue (cqlink &rear)//创建一个空的循环链队列rear
  13. {
  14.     rear=(cqnode*)malloc(sizeof(cqnode));
  15.     rear->next=rear;
  16.     return OK;
  17. }

  18. status cqlink_enqueue (cqlink &rear,qelemtype e)//在循环链队列rear中插入新的元素e,使其成为新的队尾元素
  19. {
  20.     cqnode *q;
  21.     q=(cqnode*)malloc(sizeof(cqnode));
  22.     q->data=e;
  23.     q->next=rear->next;
  24.     rear->next=q;
  25.     rear=q;
  26.     return OK;
  27. }

  28. status cqlink_DeQueue (cqlink &rear,qelemtype &e)//在循环链队列rear中删除队首元素,并用e返回其值
  29. {
  30.     cqnode *p=rear->next,*q;
  31.     if(rear==p) return ERROR;
  32.     q=p->next;
  33.     e=q->data;
  34.     if(q==rear) rear=p;
  35.     p->next=q->next;
  36.     free(q);
  37.     return OK;
  38. }

  39. status cqlink_Display(cqlink rear)//从队首到队尾,依次输出链队列中各数据元素的值
  40. {
  41.     cqnode *p = rear->next->next;
  42.     while (p != rear->next) {
  43.         printf("%d ", p->data);
  44.         p = p->next;
  45.     }
  46.     printf("\n");
  47.     return OK;
  48. }

  49. int main()
  50. {
  51.     cqlink rear;
  52.     qelemtype e;
  53.     int n, i, j, d, g;
  54.    
  55.     cqlink_InitQueue(rear);
  56.     printf("请输入队列长度:\n");
  57.     scanf("%d", &n);
  58.     printf("请输入队列元素值:\n");
  59.     for (i = 0; i < n; i++) {
  60.         scanf("%d", &e);
  61.         cqlink_enqueue(rear, e);
  62.     }
  63.     printf("队列中各元素值为:");
  64.     cqlink_Display(rear);
  65.    
  66.     printf("请输入要入队的数:\n");
  67.     scanf("%d", &d);
  68.     printf("入队后队列中各元素值为:");
  69.     for (i = 0; i < d; i++) {
  70.         scanf("%d", &e);
  71.         cqlink_enqueue(rear, e);
  72.     }
  73.     cqlink_Display(rear);
  74.    
  75.     printf("请输入要出队的次数:\n");
  76.     scanf("%d", &g);
  77.     printf("出队的数为:");
  78.     for (j = 0; j < g; j++) {
  79.         cqlink_DeQueue(rear, e);
  80.         printf("%d ", e);
  81.     }
  82.     printf("\n");
  83.    
  84.     return 0;
  85. }
复制代码


这段代码实现了一个只带尾指针的循环链队列,并完成了入队和出队的操作。在主函数中,首先通过 cqlink_InitQueue 函数创建了一个空的循环链队列,并根据输入的队列长度和元素值,使用 cqlink_enqueue 函数将元素依次入队,并使用 cqlink_Display 函数输出队列中各元素值。接下来,根据输入的入队次数,使用 cqlink_enqueue 函数将元素入队,并再次使用 cqlink_Display 函数输出入队后的队列中各元素值。最后,根据输入的出队次数,使用 cqlink_DeQueue 函数将队首元素出队,并输出出队元素的值。

希望可以帮到你!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-26 18:03:59 | 显示全部楼层
这是一个简单的只带尾指针的循环链队列的代码框架,需要完善cqlink_Display函数来输出链队列中各数据元素的值。

  1. #include<stdio.h>
  2. #include<stdlib.h>

  3. #define maxqsize 100
  4. #define OK 1
  5. #define ERROR 0

  6. typedef int status;
  7. typedef int qelemtype;

  8. typedef struct cqnode {
  9.     qelemtype data;     // 数据域
  10.     struct cqnode* next; // 指针域
  11. } cqnode, * cqlink;

  12. status cqlink_InitQueue(cqlink& rear) // 创建一个空的循环链队列rear
  13. {
  14.     rear = (cqnode*)malloc(sizeof(cqnode));
  15.     rear->next = rear;
  16.     return OK;
  17. }

  18. status cqlink_enqueue(cqlink& rear, qelemtype e) // 在循环链队列rear中插入新的元素e,使其成为新的队尾元素
  19. {
  20.     cqnode* q;
  21.     q = (cqnode*)malloc(sizeof(cqnode));
  22.     q->data = e;
  23.     q->next = rear->next;
  24.     rear->next = q;
  25.     rear = q;
  26.     return OK;
  27. }

  28. status cqlink_DeQueue(cqlink& rear, qelemtype& e) // 在循环链队列rear中删除队首元素,并用e返回其值
  29. {
  30.     cqnode* p = rear->next;
  31.     if (rear == p)
  32.         return ERROR;
  33.     cqnode* q = p->next;
  34.     e = q->data;
  35.     if (q == rear)
  36.         rear = p;
  37.     p->next = q->next;
  38.     free(q);
  39.     return OK;
  40. }

  41. status cqlink_Display(cqlink rear) // 从队首到队尾,依次输出链队列中各数据元素的值
  42. {
  43.     cqnode* p = rear->next;
  44.     while (p != rear)
  45.     {
  46.         printf("%d ", p->data);
  47.         p = p->next;
  48.     }
  49.     if (p != NULL)
  50.         printf("%d", p->data);
  51.     printf("\n");
  52.     return OK;
  53. }

  54. int main()
  55. {
  56.     cqlink rear;
  57.     qelemtype e;
  58.     int n, i, j, d, g;

  59.     cqlink_InitQueue(rear);

  60.     printf("请问要入队几次:\n");
  61.     scanf("%d", &d);
  62.     printf("请输入要入队的数:\n");
  63.     for (i = 0; i < d; i++)
  64.     {
  65.         scanf("%d", &e);
  66.         cqlink_enqueue(rear, e);
  67.     }

  68.     printf("入队后的队列中各元素值为:");
  69.     cqlink_Display(rear);

  70.     printf("请问要出队几次:\n");
  71.     scanf("%d", &g);
  72.     printf("出队的数为:");
  73.     for (j = 0; j < g; j++)
  74.     {
  75.         cqlink_DeQueue(rear, e);
  76.         printf("%d ", e);
  77.     }
  78.     printf("\n");

  79.     printf("出队后的队列中各元素值为:");
  80.     cqlink_Display(rear);

  81.     return 0;
  82. }
复制代码


这个代码将根据输入的队列长度和元素值创建了一个带头结点的循环链表表示的队列,并实现了入队和出队操作,最后输出相应的结果。
请注意,本回答来自GPT-4
如果问题已经解决,请设置最佳答案
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-3 13:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表