求详细解释每行每行!代码的意思,越详细越好

这个是题目:

img

第一小题代码:

img

第二小题:

img

img

一定要详细一点,这是王晓东版数据结构的练习题,我基础差,看不懂什么意思,请把每行代码是什么意思和作用详细说清楚,辛苦了

功能第一张图里已经告诉你了啊,你哪个地方看不明白呢
一会加个注释给你




//把Q分成两个队列,第1/3/5元素放在Q2中,其余放在Q1中
void QueueSplit(Queue &Q1,Queue &Q2,Queue Q)
{
    QueueFree(Q1); //释放Q1的空间,这里是避免Q1中有数据,所以先把Q1清空
    QueueFree(Q2); //释放Q2的空间,这里是避免Q2中有数据,所以先把Q2清空

    //front是队列的头节点,next是头节点的下一个节点,rear是队列的尾结点

    while(Q->front) //如果前一个节点不为0
    {
        if(Q1->front) Q1->rear->next = Q->front; //如果Q1队列的头节点不为0,就把Q队列的头节点插入Q1的尾部
        else Q1->front = Q->front; //如果Q1队列的头结点为0,说明Q1队列为空,就把Q队列的头结点作为Q1队列的头结点

        Q1->rear = Q->front; //把Q1的尾结点设为Q队列的头节点(也是Q1中新插入的节点)

        Q->front = Q->front->next; //Q队列的头结点后移,把下一个节点作为Q队列的新的头节点
        if(Q->front) //如果Q队列的头结点不为0
        {
            if(Q2->front) Q2->rear->next = Q->front; //如果Q2队列的头节点不为0,就把Q队列的头节点插入Q2的尾部
            else Q2->front = Q->front;//如果Q2队列的头结点为0,说明Q2队列为空,就把Q队列的头结点作为Q2队列的头结点

            Q2->rear = Q->front; //把Q2的尾结点设为Q队列的头节点(也是Q2中新插入的节点)

            Q->front = Q->front->next;//Q队列的头结点后移,把下一个节点作为Q队列的新的头节点
        }
    }
    //Q队列中的元素全部出队后,把Q1和Q2的末尾节点的下一个节点设为0,以便在遍历队列的时候能够正确的结束
    if(Q1->rear) Q1->rear->next = 0;
    if(Q2->rear) Q2->rear->next = 0;
}

举个例子,假设Q中的元素是 1 2 3 4 5 6 7
初始的时候,Q1和Q2都是空队列(Q1->front= Q1->rear=0,Q2->front= Q2->rear=0),Q->front指向1这个节点,Q->rear指向7这个节点,Q->front->next是指向节点2
开始while循环:
Q->front指向节点1,Q1->front = 0,执行else语句,把Q->front这个节点设为Q1的头节点,也就是Q1->front = Q->front,然后把Q1队列的尾结点也设置为Q->front,
也就是Q1->front和Q1->rear都指向了节点1

Q->front = Q->front->next这里,Q队列后移一位,节点2称为Q队列的新头节点

下面的if else也是一个逻辑,一次while循环,把Q队列的第一个元素插入Q1的队尾,把Q队列的第2个元素插入Q2的队尾,以此类推,直到Q队列的所有元素全部被插入Q1和Q2

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632