0

我编写了代码以根据用户选择从列表中删除特定节点,代码对于特定值非常有效,但是如果我多次调用它意味着如果我连续调用它 2 次,那么我的另一个函数pointer_to_node(index)中的一个给出了我也实施了边界错误来记录这些条件,

实际上,我需要多次调用的原因是我必须编写一个单独的函数来删除所有节点。我正在尝试使用这个函数来完成这个任务,方法是使用一个for循环到我的循环单链表大小。但在这种情况下,它也会返回一个NULL指针并给我一个越界消息(由我在代码中实现)。我在这里包含了我的两个功能

void remove_from_index(int index){
  Node*temptr;
  temptr = new Node;
  int tempdata;

  if (index==1)//means remove from first
  {
    temptr = firstptr;
    tempdata= temptr->data;
    firstptr = firstptr->nextptr;
    lastptr->nextptr=firstptr;
    delete(temptr);
  } else if(index==size_of_list()) //means last node
  {
    temptr = pointer_to_node(index);
    index--; //get pointer of 2nd last position
    lastptr = pointer_to_node(index);//setting 2nd last as last postion
    temptr->nextptr=NULL;
    temptr=NULL;
    lastptr->nextptr=firstptr;
    delete (temptr);
  } else  // any position of node
  {
    temptr = pointer_to_node(index);
    tempdata = temptr->data;
    index--; // to get address of back

    Node* temp2ptr;
    temp2ptr = new Node;

    temp2ptr = pointer_to_node(index);

    index = index+2;

    Node* temp3ptr;
    temp3ptr = new Node;

    temp3ptr = pointer_to_node(index);

    temp2ptr->nextptr = temp3ptr;

    temptr->nextptr=NULL;
    delete (temptr);
  }
}


Node* pointer_to_node(int index){
  Node*temptr;
  temptr = new Node;
  temptr = firstptr;

  Node*temptr2;
  temptr2 = new Node;
  temptr2 = NULL;
  int count = 1;

  while (temptr!=temptr2){
    if (count==index)
    {
      return temptr;
    }

    count++;
    temptr2=firstptr;
    temptr=temptr->nextptr;
  }

  if (index>size_of_list())
  {
    temptr=NULL;
    cout<< "Can't You think in bounds. Take your NULL Pointer ";
    return temptr;
    delete temptr;
    delete temptr2;
  }
}
4

2 回答 2

0

我认为除了所有已经有据可查的内存泄漏和样式问题之外,这里的另一个可能问题是您的代码似乎无法处理列表中只有一件事的情况。

如果发生这种情况,它将删除该节点,但离开firstptrlastptr指向随机内存。

如果您的 size_of_list() 函数只是计算列表中的节点,它可能仍会认为还有非零节点,然后您可能会尝试删除或以其他方式访问另一个节点。

于 2012-12-15T14:26:27.070 回答
0

您有几个内存泄漏:

temptr->nextptr=NULL;
temptr=NULL; // BAD!! BAD!! Remove it otherwise you will not actually free
lastptr->nextptr=firstptr;
delete (temptr);

这里也是(实际上你在代码的四个地方都有这个):

Node* temp2ptr;
temp2ptr = new Node; // BADD!! Why do you allocate if you are going to reassign?
temp2ptr = pointer_to_node(index);

删除坏处,您将避免内存泄漏。

尽管如此,这并不能解决您的问题。

您还可以在这里返回后进行操作:

return temptr;
delete temptr;
delete temptr2;

这些永远不会被执行。

编辑您的pointer_to_node功能太复杂,请更改为

Node* pointer_to_node(int index) {
    Node* tempPtr = firstptr;
    for (int i = 0; i < index; i++) {
         tempPtr = tempPtr->nextptr;
    }
    return tempPtr;
}

看看这是否能解决你的问题。更多的代码行很少意味着更好的编程技能,不要人为地尝试增加它们的数量。

于 2012-12-15T13:35:57.817 回答