0

I wrote the code to remove a particular node from list according to user choice, code works perfectly fine for a particular value but if i make several calls to it meaning if I call it 2 times continuously then one of my another function pointer_to_node(index) gives an out of bounds error which was also implemented by me to record such conditions,

Actually, why I need several calls is that I have to write a separate function to remove all the nodes. I am trying to accomplish that task using this function by using a for loop up to the size of my Circular Singly Linked list. But in that case it also returns me a NULL pointer and gives me out of bounds message (implemented by me in code). I have included both my functions down here

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

すでに十分に文書化されているすべてのメモリリークとスタイルの問題は別として、ここで考えられる別の問題は、リストに1つしかない場合をコードが処理していないように見えることです。

それが発生した場合、そのノードは削除されますが、ランダムなメモリを残し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);

ここでも (実際には、コードの 4 か所にこれがあります):

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

Bads を削除すると、メモリ リークを回避できます。

それでも、これで問題が解決するわけではありません。

また、ここに戻った後の操作があります:

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 に答える