针对链队列的添加节点元素遇到的问题的思考和解决

下面这段是个错误的例子,是本人写的一个错误的情况,以此例子展开一个探索性学习,加深自身对代码运行的理解。如有错误,欢迎指出,一起成长,一起学习

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

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值