数据结构C语言实现----出队伍操作

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;
}

运行结果:

数据结构C语言实现----出队伍操作