链表:将值分配给节点的下一部分时出现分段错误错误
Posted
技术标签:
【中文标题】链表:将值分配给节点的下一部分时出现分段错误错误【英文标题】:Linked List: Segmentation fault error when assigning a value to the next part of a node 【发布时间】:2016-08-08 10:34:57 【问题描述】:这是我在这里的第一个问题,我的英语不是很好,所以请多多包涵。
我试图创建一个链表,其中包含一个在特定位置插入元素的函数。为此,我需要定位 PREDPTR,但我无法做到这一点,因为每当我运行程序时,我总是会遇到分段错误。我相信错误在于“predptr->next = first;”部分在 insert() 函数中,但是当我将 predptr(上面的行)设置为“predptr = new Node()”时它可以工作,但它总是触发插入函数中的第二种情况。
代码如下:
//Class List
class List
private:
//Class Node
class Node
public:
string data;
Node * next;
//Node constructor
Node()
data = "";
next = 0;
//Node constructor with value
Node(string val)
data = val;
next = 0;
;
int mySize;
Node * first;
public:
//List constructor
List()
mySize = 0;
first = 0;
//Insert Function
void insert(string val, int pos)
Node * newptr, * predptr;
newptr = new Node(val);
predptr = new Node();
predptr->next = first;
cout << "Pred: " << newptr->data << endl;
//Position predptr
for(int i = 0; i < pos; i++)
predptr = predptr->next;
//CASE 1: Inserting at the middle or end of the List
if(predptr != 0)
cout << "NF" << endl;
newptr->next = predptr->next;
predptr->next = newptr;
//CASE 2: Inserting at the beginning of the List
else
cout << "F" << endl;
newptr->next = first;
first = newptr;
delete predptr;
mySize++;
int main()
List a;
cout << (a.empty() ? "Yes" : "No") << endl;
cout << "Inserting 5 elements..." << endl;
a.insert("Asus", 1);
a.insert("Acer", 2);
a.insert("Sony", 3);
a.insert("Toshiba", 4);
cout << "List A: ";
a.display();
cout << endl;
return 0;
【问题讨论】:
缺少empty
和display
方法。当调用这些方法的行被注释掉时,一切正常。因此,其中一种方法可能有问题。没有代码就不可能找到错误
predptr = predptr->next;如果你传递了一个 pos 并且 predptr->next 无效怎么办? - pos 未绑定到此代码中的列表。
【参考方案1】:
可能出现问题的第一条线索就在这里,insert()
:
newptr = new Node(val);
predptr = new Node();
逻辑规则规定,如果希望insert()
向列表中添加一个值,那么创建两个新节点而不是一个,显然是错误的。您希望在这里只创建一个新节点。不是两个。
insert()
中的逻辑完全错误。真的无法挽救它。这里唯一的选择是从头开始重写它:
Node * newptr=new Node(val);
Node **predptr=&first;
while ( (*predptr) && pos)
predptr= & (*predptr)->next;
--pos;
newptr->next= *predptr;
*predptr=newptr;
就是这样。如果 pos
作为 0 传入,这会将新节点插入到列表中的第一个位置,如果是 1,则为第二个,依此类推……这种性质的事物是从 0 开始的。如果您希望位置 #1 而不是位置 #0 成为列表的第一个元素,只需在循环前递减 pos
。
如果pos
超出列表的大小,则代码不会崩溃,这与您的尝试不同,只需将新节点添加到列表末尾即可。
我会用一句话来结束这篇文章:
“你对管道的考虑越多,就越容易堵塞管道 排水。”
斯科蒂,星际迷航 III。
插入链表是一个简单的操作。这应该不是一个复杂的过程。
【讨论】:
嗨山姆·瓦尔沙夫奇克!很抱歉回复很晚。这是正确的,但我们的教授没有彻底解释说明。他希望我们使用书中找到的算法和代码,所以他没有接受我修改后的工作(根据你的回答)。不过还是谢谢你的回答。 你需要找一个不同的导师。你的导师不称职,而且弊大于利。如果您希望从事计算机程序员的职业,那么您将不会从他那里学到很多东西。以上是关于链表:将值分配给节点的下一部分时出现分段错误错误的主要内容,如果未能解决你的问题,请参考以下文章