l_xox_l 2022-10-20 20:42 采纳率: 81.3%
浏览 43
已结题

关于c++链表的问题,拴q了!

一共有4个问题


#include<iostream>
#include<string>
using namespace std;


class list
{
private:
    int data;
    list* next_node;

    using lp = list*;


private:
    lp head;
    lp end;
public:
    list() {};
    list(int s)
    {
        this->head;
        
        this->end = NULL;
        head = end;
        
    }


public:
    void print();
    void insert(int a);
};

void list::print()
{
    lp cur = this->head;
    while (cur != NULL)
    {
        cout << cur->data << "->" << endl;
        cur = cur->next_node;
        
    }

};




void list::insert(int a)
{
    lp newnode;
    lp tempt = this->head;
    newnode = new list;
    if (tempt == NULL)
    {
        this->head = newnode;
        newnode->data = a;
        newnode->next_node = NULL;
        //问题1
        //开始时head指向空
        //当我执行了this->head = newnode;
        // 这条语句后是在head指向的一块新的list空间
        // 我存储的第一个data的数据应该是在那个list空间存储
        //那这样的话为什么我在开始打印时是从head这个地址开始取data的地址的,照理说他应该第一次输出数据的时候应该
        //找不到第一个data数据然后编译器才对啊
        /*void list::print()
        {
            lp cur = this->head;
            while (cur != NULL)
            {
                cout << cur->data << "->" << endl;
                cur = cur->next_node;

            }

        };*/
    }
    else
    {
        if (tempt->next_node == NULL)
        {
            tempt->next_node = newnode;
            newnode->data = a;
            newnode->next_node = NULL;
        }
        if (tempt->next_node != NULL)
        {
            while(tempt->next_node != NULL)
            {
                //问题2
                //按理说tempt->next_node!= NULL不是个死循环吗
                //因为tempt = tempt->next_node;只是tempt的地址不断改变
                // 而tempt->next_node地址没有改变,
                // 那样的话整体不就是死循环吗
                //可是他却可以输出
                tempt = tempt->next_node;
            }
            //问题三
            //tempt经过迭代以后,tempt的地址应该是倒数第二个,然后它指向倒数第一个list的空间
            //然后tempt->next_node指向NULL
            //那样的话tempt不会覆盖了原来这个元素的位置吗
            tempt->data = a;
            tempt->next_node = newnode;
            newnode->next_node = NULL;
        }
        
    }

}

void test()
{
    list p(1);
    //使用含参构造函数原因
    //默认构造函数会被多次调用,head会不断的被指向NULL,所以使用含参构造函数,这样一来head只会在开始时指向NULL
    p.insert(4);
    p.insert(8);
    p.insert(1);
    p.insert(3);
    p.insert(55);
    p.print();
}


int main()
{
    test();
    system("pause");
    return 0;
}

img


为什么它第二个的数据的位置被跳过了

  • 写回答

3条回答 默认 最新

  • X-道至简 2022-10-20 21:16
    关注

    问题一 不太理解,head指向你第一个插入的值 p.insert(4); head里面的data是4, 声明那个data 1没有用。如果你没有插入数据是没有输出的


    问题二 tempt = tempt->next_node; 这句话tempt是不断迭代的 1-2-3 会实现1-3的迭代,不会出现死循环


    问题三 如下代码有2个问题,第一是 if (tempt->next_node != NULL) 这个if改成else。第二个如下

                //问题三
                //tempt经过迭代以后,tempt的地址应该是倒数第二个,然后它指向倒数第一个list的空间
                //然后tempt->next_node指向NULL
                //那样的话tempt不会覆盖了原来这个元素的位置吗
                tempt->data = a;          
                tempt->next_node = newnode;
                newnode->next_node = NULL;
    

    改成

                tempt->next_node = newnode;
                newnode->data = a;  
                newnode->next_node = NULL;
    

    第四个问题 第二个数据被跳过了是第三个问题的原因,赋值错了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 10月29日
  • 已采纳回答 10月21日
  • 创建了问题 10月20日

悬赏问题

  • ¥15 做个有关计算的小程序
  • ¥15 MPI读取tif文件无法正常给各进程分配路径
  • ¥15 如何用MATLAB实现以下三个公式(有相互嵌套)
  • ¥30 关于#算法#的问题:运用EViews第九版本进行一系列计量经济学的时间数列数据回归分析预测问题 求各位帮我解答一下
  • ¥15 setInterval 页面闪烁,怎么解决
  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动
  • ¥20 对于工程问题的非线性数学模型进行线性化