C++链表问题

shelmi 2014-06-06 05:18:46

struct Node
{
T data;
Node<T>* next;
};

template<class T>
class myList
{
private:
Node<T>* head;
int num;
public:
myList(){head = NULL; num = 0;}
~myList(){}
void insertNode(T elem)
{
num++;
Node<T>* p = head;
Node<T>* temp = new Node<T>;
temp->data = elem;
temp->next = NULL;
if(head == NULL)
{
head = temp; //此处若为 p = temp 则head一直为NULL
cout<<"one node inserted\n";
}
else
{
while(p->next != NULL) // p==NULL
{
cout<<"inserting...\n";
p = p->next;
}
p->next = temp; //p=temp;
}
}

};



上面的代码是一个链表的插入和打印,是没问题的。但如果把里面对应注释的那几行换成注释里面的代码,链表就错了,比如第一个会造成head一直为NULL。我有点凌乱了。所以想请问各位是什么原因导致这样的问题。谢谢大家。
...全文
166 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
shelmi 2014-06-07
  • 打赏
  • 举报
回复
也就是说如果一个指针q没初始化,拿另外一个指针p指向q,再修改p的话,对q是没影响的?我是想知道这背后的原理是什么,为什么head不为NULL之后,p指向head就可以正常插入数据而且进行打印,是因为head为NULL,其实是系统是没给head分配内存的吗
buyong 2014-06-07
  • 打赏
  • 举报
回复
引用 3 楼 Incy_1218 的回复:
也就是说如果一个指针q没初始化,拿另外一个指针p指向q,再修改p的话,对q是没影响的?我是想知道这背后的原理是什么,为什么head不为NULL之后,p指向head就可以正常插入数据而且进行打印,是因为head为NULL,其实是系统是没给head分配内存的吗
指针也是一个变量,只是这个变量的值的含义代表一个地址。 所以他也是按值传递的。 先来个int int a=0, b=0; a=b; b=1; a现在是0 再来个指针的 int* a = 0; int* b =0; a =b; b = new int; 现在a还是0
肖邦之离歌 2014-06-06
  • 打赏
  • 举报
回复
哦哦,看懂了。第二个问题实际是和第三个问题关联的,所以我一并回答了。 你的程序本来是找到链表的末尾,

while(p->next != NULL)    // p==NULL
        {
            cout<<"inserting...\n";
            p = p->next;
        }
然后插入temp
p->next = temp;  //p=temp;
这样如你所说是没有问题的。但是如果你改成注释的代码。就是到了最后一个元素的后面也就是NULL,NULL怎么会有next呢,再说了如果你执行p=temp这句并没有把temp和链表连在一起。只是让p指向了temp而已。
肖邦之离歌 2014-06-06
  • 打赏
  • 举报
回复
我没有搞太懂你的意思,但是我可以回答你的第一个问题。你有没有发现如果改成注释后的代码,head就没有复制操作,head一开始被初始化为NULL,你以后都没有给它赋其他的值,所以肯定一直是NULL了。你写成p = temp只是让p指向temp而不再指向head,虽然前面有p=head,但是p并不代表head,所以执行p=temp并没有改变head的值

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧