下面这段是个错误的例子,是本人写的一个错误的情况,以此例子展开一个探索性学习,加深自身对代码运行的理解。如有错误,欢迎指出,一起成长,一起学习
#include<iostream>
using namespace std;
typedef struct node
{
int data;
struct node * next;
}Node;
typedef struct Qnode
{
Node * front;
Node * rear;
}NodePointer;
void PushNode(NodePointer & q,int elemt) //插入元素
{
Node * node = (Node *)malloc(sizeof(Node));
if(!node)
{
cout << "\n\t\t内存分配失败,程序退出" << endl;
exit(-1);
}
node->next = NULL;
node->data = elemt;
if(q.front == NULL)
{
q.front = node;
q.rear = node;
}
else
{
q.rear->next = node;
q.rear = node;
}
cout << "\n\t\t插入元素成功!" << endl;
return;
}
void show(NodePointer & q)
{
if(q.front == NULL)
{
cout << "队列为空" << endl;
}
Node * p = q.front;
while(p != q.rear)
{
cout << p->data << endl;
p = p->next;
}
cout << p->data << end; //输出最后一个元素
}
int main(void)
{
NodePointer q;
q.front = (Node *)malloc(sizeof(Node)); //链队列初始化
q.rear = (Node *)malloc(sizeof(Node));
q.front->next = NULL;
q.rear->next = NULL;
PushNode(q,100);
PushNode(q,10);
PushNode(q,101);
PushNode(q,102);
PushNode(q,103);
PushNode(q,104);
show(q);
}
这段代码是链队列的一部分,分别为链队列的初始化、数据元素入队操作、链队列的输出操作。
但是运行了这段代码之后发现了问题,如下所示:
发现输出只有测试的插入元素的部分和一段地址码,之后疑惑之时,对整个代码进行了Debug
front指针仅保存了一个地址,rear指针保存的是最后一个节点元素
经过好一会分析,发现问题出现在一下这几个方面
然后加入下面这段代码测试了下if究竟有没有执行
运行了下,发现if条件语句是没有执行的
之后又对else做了测试,如下图
运行结果如下:
发现六个元素的录入触发的都是else条件语句
至于为什么rear指针保存的是最后一个元素的问题,根据下面这段代码仔细的推了下
这段代码的运行的图解如下
根据这个循序不断的迭代更新rear保存的地址,所以迭代到最后保存的恰好就是最后一个元素的地址。这便是链表迭代法尾部插入节点的操作。
所以上面的代码真正的问题还是if条件语句的不执行,想了一会修改了下,加入了以下这段代码。
然后再次测试了if,发现if还是不执行的,但是遍历链表的输出除了一个位置的地址,其他元素都已经输出了;
分析了下,因为加入的这段代码去q.front = q.rear ,使得front指针保存了rear的地址,所以front不执行,但是恰恰保存的这个地址使得front指向了rear指针地址,然后rear指针又在接下来元素的录入中指向了下一个节点元素的地址,而节点元素的next指针又指向了下一个元素的地址,成功的串联成了链表。
所以后续的正确输出只需要越过front指针直接输出front指针的next指针以后的节点元素即可
void show(NodePointer& q)
{
if (q.front == NULL)
{
cout << "队列为空" << endl;
}
Node* p = q.front->next;
while (p != q.rear)
{
cout << p->data << endl;
p = p->next;
}
cout << q.rear->data << endl;
}
完整修改后的代码如下:
#include<iostream>
using namespace std;
typedef struct node
{
int data;
struct node* next;
}Node;
typedef struct Qnode
{
Node* front;
Node* rear;
}NodePointer;
void PushNode(NodePointer& q, int elemt) //插入元素
{
Node* node = (Node*)malloc(sizeof(Node));
if (!node)
{
cout << "\n\t\t内存分配失败,程序退出" << endl;
exit(-1);
}
node->next = NULL;
node->data = elemt;
if (q.front == NULL)
{
q.front = node;
q.rear = node;
}
else
{
q.rear->next = node;
q.rear = node;
}
cout << "\n\t\t插入元素成功!" << endl;
return;
}
void show(NodePointer& q)
{
if (q.front == NULL)
{
cout << "队列为空" << endl;
}
Node* p = q.front->next;
while (p != q.rear)
{
cout << p->data << endl;
p = p->next;
}
cout << q.rear->data << endl;
}
int main(void)
{
NodePointer q;
q.front = (Node*)malloc(sizeof(Node));
q.rear = (Node*)malloc(sizeof(Node));
q.front = q.rear;
q.front->next = NULL;
q.rear->next = NULL;
PushNode(q, 100);
PushNode(q, 10);
PushNode(q, 101);
PushNode(q, 102);
PushNode(q, 103);
PushNode(q, 104);
show(q);
}