0

私の講師は、関数 remove() を次のように定義しました。

struct node
{
  node *next;
  int value;
}

int IntList::remove()
{
  node *victim = first;
  int result;

  if(isEmpty()) throw listIsEmpty();

  first = victim->next;
  result = victim->value;
  delete victim;
  return result;
}

どこでfirst「これを表すノードのシーケンスを指しIntListます。」

犠牲者と最初の両方が同じものを指している場合、犠牲者を削除すると、これも最初に削除されませんか?

4

2 に答える 2

3

犠牲者と最初の両方が同じものを指している場合、犠牲者を削除すると、これも最初に削除されませんか?

削除の時点で、それらは同じものを指していません。

基本的にここで起こっていることは、2 番目のノードが最初のノードになり、古い最初のノードが削除されているということです。

first = victim->next削除の前から、リンクされたリストで発生しない限り、同じになることはありませんfirst == victimvictim->next == victim


簡単な例として、次のように仮定します。

first is at address 0xDEAD (crazy address, but go with it)
first->next is at address 0xF00D

すると以下のように落ちます。

node *victim = first; //victim = 0xDEAD
first = victim->next; //first = 0xF00D, so first now = first->next
delete victim; //victim = 0xDEAD, so you deleted the original first
于 2012-12-01T06:27:01.157 に答える
0

いいえ、リストの最初のノードは削除されません。

「int IntList::remove()」関数では、まず最初のノードを先に進めてから、犠牲ノードを削除するためです。

したがって、犠牲者のみが削除され、あなたの場合、リストの次のノードが新しい最初のノードになります。:)

于 2012-12-01T07:28:00.510 に答える