这个是题目:
第一小题代码:
第二小题:
一定要详细一点,这是王晓东版数据结构的练习题,我基础差,看不懂什么意思,请把每行代码是什么意思和作用详细说清楚,辛苦了
这个是题目:
第一小题代码:
第二小题:
一定要详细一点,这是王晓东版数据结构的练习题,我基础差,看不懂什么意思,请把每行代码是什么意思和作用详细说清楚,辛苦了
功能第一张图里已经告诉你了啊,你哪个地方看不明白呢
一会加个注释给你
//把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