链表:将值分配给节点的下一部分时出现分段错误错误

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;

【问题讨论】:

缺少emptydisplay 方法。当调用这些方法的行被注释掉时,一切正常。因此,其中一种方法可能有问题。没有代码就不可能找到错误 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。

插入链表是一个简单的操作。这应该不是一个复杂的过程。

【讨论】:

嗨山姆·瓦尔沙夫奇克!很抱歉回复很晚。这是正确的,但我们的教授没有彻底解释说明。他希望我们使用书中找到的算法和代码,所以他没有接受我修改后的工作(根据你的回答)。不过还是谢谢你的回答。 你需要找一个不同的导师。你的导师不称职,而且弊大于利。如果您希望从事计算机程序员的职业,那么您将不会从他那里学到很多东西。

以上是关于链表:将值分配给节点的下一部分时出现分段错误错误的主要内容,如果未能解决你的问题,请参考以下文章

段错误:链表节点插入函数 [C++]

返回指针时出现分段错误[关闭]

将指向数组的指针传递给函数时出现分段错误(C++)

删除时出现分段错误

创建链表时出现神秘的分段错误(添加功能)

分段错误:在 C++ 中弹出向量时出现 11