乔治爱啃脚趾 发表于 2023-10-26 18:03:31

只带尾指针的循环链队列的入队和出队

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

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

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

3) 将循环链队列的队首元素出队,并输出出队元素的值和出队后队列中各元素值。
请大佬们帮忙完善这个代码。
#include<stdio.h>
#include<stdlib.h>
#define maxqsize 100
#define OK 1
#define ERROR 0
typedef int status;
typedef int qelemtype;
typedef struct cqnode {
    qelemtype data;      //数据域
    struct cqnode *next; //指针域
}cqnode,*cqlink;
status cqlink_InitQueue (cqlink &rear)//创建一个空的循环链队列rear
{
        rear=(cqnode*)malloc(sizeof(cqnode));
        rear->next=rear;
        return OK;
}
status cqlink_enqueue (cqlink &rear,qelemtype e)//在循环链队列rear中插入新的元素e,使其成为新的队尾元素
{
        cqnode *q;
        q=(cqnode*)malloc(sizeof(cqnode));
        q->data=e;
        q->next=rear->next;
        rear->next=q;
        rear=q;
        return OK;
}
status cqlink_DeQueue (cqlink &rear,qelemtype &e)//在循环链队列rear中删除队首元素,并用e返回其值
{
        cqnode *p=rear->next,*q;
        if(rear==p)return ERROR;
        q=p->next;
        e=q->data;
        if(q==rear) rear=p;
        p->next=q->next;
        free(q);
        return OK;
}
status cqlink_Display(cqlink rear)//从队首到队尾,依次输出链队列中各数据元素的值
{
       
}
int main()
{
        sqqueue q;
        cqlink rear;
        qelemtype e,count,x,c,t;
        int n,i,j,m,z,y,f=1,d,g;
      cqlink_InitQueue(rear);
    printf("请问要入队几次:\n");
        scanf("%d",&d);
        printf("请输入要入队的数:\n");
        for(i=0;i<d;i++)
        {
                scanf("%d",&e);
                cqlink_InitQueue(rear);
        }
        printf("请问要出队几次:\n");
        scanf("%d",&g);
        printf("出队的数为:");
        for(j=0;j<g;j++)
        {
                       cqlink_DeQueue(rear,e);
                    printf("%d ",e);
        }
        return 0;
}

isdkz 发表于 2023-10-26 18:03:45

下面是完善后的代码:

#include<stdio.h>
#include<stdlib.h>
#define maxqsize 100
#define OK 1
#define ERROR 0
typedef int status;
typedef int qelemtype;
typedef struct cqnode {
    qelemtype data;      //数据域
    struct cqnode *next; //指针域
}cqnode,*cqlink;

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

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

status cqlink_DeQueue (cqlink &rear,qelemtype &e)//在循环链队列rear中删除队首元素,并用e返回其值
{
    cqnode *p=rear->next,*q;
    if(rear==p) return ERROR;
    q=p->next;
    e=q->data;
    if(q==rear) rear=p;
    p->next=q->next;
    free(q);
    return OK;
}

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

int main()
{
    cqlink rear;
    qelemtype e;
    int n, i, j, d, g;
   
    cqlink_InitQueue(rear);
    printf("请输入队列长度:\n");
    scanf("%d", &n);
    printf("请输入队列元素值:\n");
    for (i = 0; i < n; i++) {
      scanf("%d", &e);
      cqlink_enqueue(rear, e);
    }
    printf("队列中各元素值为:");
    cqlink_Display(rear);
   
    printf("请输入要入队的数:\n");
    scanf("%d", &d);
    printf("入队后队列中各元素值为:");
    for (i = 0; i < d; i++) {
      scanf("%d", &e);
      cqlink_enqueue(rear, e);
    }
    cqlink_Display(rear);
   
    printf("请输入要出队的次数:\n");
    scanf("%d", &g);
    printf("出队的数为:");
    for (j = 0; j < g; j++) {
      cqlink_DeQueue(rear, e);
      printf("%d ", e);
    }
    printf("\n");
   
    return 0;
}


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

希望可以帮到你!

陶远航 发表于 2023-10-26 18:03:59

这是一个简单的只带尾指针的循环链队列的代码框架,需要完善cqlink_Display函数来输出链队列中各数据元素的值。

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

#define maxqsize 100
#define OK 1
#define ERROR 0

typedef int status;
typedef int qelemtype;

typedef struct cqnode {
    qelemtype data;   // 数据域
    struct cqnode* next; // 指针域
} cqnode, * cqlink;

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

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

status cqlink_DeQueue(cqlink& rear, qelemtype& e) // 在循环链队列rear中删除队首元素,并用e返回其值
{
    cqnode* p = rear->next;
    if (rear == p)
      return ERROR;
    cqnode* q = p->next;
    e = q->data;
    if (q == rear)
      rear = p;
    p->next = q->next;
    free(q);
    return OK;
}

status cqlink_Display(cqlink rear) // 从队首到队尾,依次输出链队列中各数据元素的值
{
    cqnode* p = rear->next;
    while (p != rear)
    {
      printf("%d ", p->data);
      p = p->next;
    }
    if (p != NULL)
      printf("%d", p->data);
    printf("\n");
    return OK;
}

int main()
{
    cqlink rear;
    qelemtype e;
    int n, i, j, d, g;

    cqlink_InitQueue(rear);

    printf("请问要入队几次:\n");
    scanf("%d", &d);
    printf("请输入要入队的数:\n");
    for (i = 0; i < d; i++)
    {
      scanf("%d", &e);
      cqlink_enqueue(rear, e);
    }

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

    printf("请问要出队几次:\n");
    scanf("%d", &g);
    printf("出队的数为:");
    for (j = 0; j < g; j++)
    {
      cqlink_DeQueue(rear, e);
      printf("%d ", e);
    }
    printf("\n");

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

    return 0;
}


这个代码将根据输入的队列长度和元素值创建了一个带头结点的循环链表表示的队列,并实现了入队和出队操作,最后输出相应的结果。
请注意,本回答来自GPT-4
如果问题已经解决,请设置最佳答案
页: [1]
查看完整版本: 只带尾指针的循环链队列的入队和出队