链表,我的逻辑缺陷在哪里?

时间:2017-03-03 01:22:24

标签: c++ list pointers linked-list singly-linked-list

所以我当然看了很多链接列表帮助,但我似乎无法弄清楚我的错误。我想我理解其他代码的逻辑,但有些东西与我的有关,我无法正常工作。

功能代码:

void SparseM_list::newTerm(valueType newValue, int row, int column)
MatrixTerm *n = new MatrixTerm;
        n->next = NULL;
        n->column = column;
        n->row = row;
        n->value = newValue;
        if (head != NULL)
        {
            cur = head;    
            while (cur->next != NULL) 
            {
                cur = cur->next;
                cout << "does it ever get inside the while loop? cur and curnext -> " << cur << " " << cur->next << endl; <-- never outputs
            }
            cur->next = n;  
        }
        else  //if head is null, n will be the starting point
        {
            head = n;
        }
        delete n;

    }

及以下是使用链表

的稀疏矩阵的私有结构/变量
struct MatrixTerm {
        valueType value; //store value of matrix element
        int column; //store column position
        int row; //store row position
        MatrixTerm *next; //point to next node in the linked list
    };

    MatrixTerm *head; //head point for the linked list
    MatrixTerm *cur, *prev;

所以基本上我的逻辑就是这个

  1. 新术语信息动态分配给Matrix Term n。
  2. 如果head为null(由默认构造函数设置),则head = n
  3. 第二组数据进入.head!= Null,所以我将cur指针设置为等于头
  4. 对于第二个数据,跳过while循环,因为head-&gt; next应为null,因此cur-&gt; next应为null。我将cur-&gt; next设置为n
  5. 第三个数据进入.Cur-> next接下来有n,所以它进入while循环。电流设置为接下来的cur->。它检查while循环条件,这次,cur-&gt; next应该为null,所以它设置为cur-&gt; next = n(第3个数据集)。
  6. 但是,它永远不会进入while循环。我搞砸了哪里? while循环用于遍历链表。

2 个答案:

答案 0 :(得分:1)

本声明

delete n;

没有意义。删除它。

我希望最初数据成员head确实设置为NULL(或nullptr)。

该函数的替代实现可能看起来像

void SparseM_list::newTerm(valueType newValue, int row, int column)
{
    MatrixTerm *n = new MatrixTerm { newValue, column, row, nullptr };

    MatrixTerm **current = &head;

    while ( *current ) current = &( *current )->next;

    *current = n;
}

如果列表允许附加新节点,则再声明一个数据成员tail会很有帮助。在这种情况下,将在尾部添加一个新节点,每次执行循环时效率更高。

还要考虑删除数据成员curprev,并将它们用作方法的局部变量。

答案 1 :(得分:0)

您不应该delete n;,因为它会释放列表节点的内存。你看,你把钥匙锁上锁,但在打开门之前拔出钥匙......你能进屋吗?

ps,删除应该保存在列表对象的desturctor中的节点。