一共有4个问题
#include
#include
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;
}
问题一 不太理解,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;
第四个问题 第二个数据被跳过了是第三个问题的原因,赋值错了
if (tempt->next_node == NULL)
{
tempt->next_node = newnode;
newnode->data = a;
newnode->next_node = NULL;
}
if (tempt->next_node != NULL)
{
=======这第二个if应该改为else if。否则上一个if满足条件后,内部代码给next_node指向newnode了,导致第二个if条件也满足,会执行。但实际不应该执行。
如果你c++语法没错的话,你可以参考下我博客的单链表操作,借鉴思路,不过是c语言写的。