0

リンクされたリストの末尾に新しい値を追加したいのですが、何らかの理由で値が追加されていないようです。新しい連結リスト割り当ての場合:

struct checkPoints *checkPt = *checkPoint;

while (checkPt != NULL) {
    checkPt = checkPt->next;
}
if (checkPt == NULL) {
    checkPt = malloc(sizeof (struct checkPoints));
    scanf("%c %d %d %d %d\n", &checkPt->dropOut, &checkPt->currentPoint, &checkPt->competitor, &checkPt->hour, &checkPt->minute);
}

アイデア?

4

5 に答える 5

3

新しいアイテムをリストに追加していません (また、新しいアイテムを割り当てるときに、リストの最後を追跡できなくなります)。試す

struct checkPoints *tail = *checkPoint;

struct checkPoints *newItem = malloc(sizeof (struct checkPoints));
scanf("%c %d %d %d %d\n", &checkPt->dropOut, &checkPt->currentPoint,
                          &checkPt->competitor, &checkPt->hour,
                          &checkPt->minute);
newItem->next = NULL;

if (tail == NULL) {
    *checkPoint = newItem
}
else {
    while (tail->next != NULL) {
        tail = tail->next;
    }
    tail->next = newItem;
}
于 2012-12-14T11:11:24.517 に答える
0

NULLcheckPtになるまでループします

これを見ることができます:

O1 --> O2 --> 03 --> ... --> オン --> NULL

したがって、checkPtnull であり、オブジェクトを作成してcheckPtポイントする場合は問題ありません。

問題は次のとおりです。現在、On は checkPt を指していません。まだNULLを指しています。(つまり、何も指さないことを意味します)。

したがって、最後のノード(この場合はOn) までトレースし、新しいオブジェクトを作成して、この lastNode が指すようにする必要があります。

これが私のコード例です:

struct checkPoints *tailPoint = *checkPoint;

  while (tailPoint->next != NULL) {
    tailPoint = tailPoint->next;
  }
  struct checkPoints *newPoints = malloc(sizeof (struct checkPoints));
  // modify newPoints here
  newPoints->next = NULL; // mark it as last node      
  tail->next = newPoint;  // now, mark you last node point to new node. and new node point to end --> NICE

ご覧のとおり、私のコードには単純な別のポイントがあります。私tailPoint->nextは NULL までトレースするので、まだ最後の要素を保持していますが、コードには何もありません。それは大きな違いです。

simonce がコメントしているように、checkPoint が null の場合、私のコードは失敗します: 多くの場合、まだリストに何もありません。したがって、変更されたコードは次のとおりです。

// i'm create newPoint first, because always need new points. this will make the code less redundant.

struct checkPoints *tailPoint = *checkPoint;
struct checkPoints *newPoint = malloc(sizeof (struct checkPoints));
// modified newPoint here
// newPoint always last node, so, it will point to NULL.
newPoint->next = NULL; 

if (checkPoint== NULL) {
    *checkPoint = newItem;  // base on new idea
}
else {
    while (tailPoint->next != NULL) {
        tailPoint = tailPoint->next;
    }
    tailPoint->next = newItem;  // as upper code, add last node to tailPoint.
}

newItemassign to checkPoint(リンクされたリストの最初のノード) とtailPoint(リンクされたリストの最後のノード)の 2 つのケースの違いに気付くはずです。

于 2012-12-14T11:19:50.837 に答える
0

これ

while (checkPt != NULL) {
    checkPt = checkPt->next;
}

checkPt が NULL になるまでループするため、最後の要素を指していません。

最も簡単なのは、リストの最後の要素を指す追加のポインターを用意することです。これにより、追加するたびに常にそれを探す代わりに、要素の追加がより効果的になります。

checkPt = malloc(sizeof (struct checkPoints));
lastitem->next = checkPt;
lastitem = checkPt;
于 2012-12-14T11:14:29.717 に答える
0

1 つずれています。

checkPtisまでループしますNULLが、その時点で、リストの最後の要素 ( になるcheckPt ) を追跡できなくなりNULLます。

next解決策は、フィールドが NULLになるまでループすることです。

for( checkPt = *checkPoint;
     checkPt != NULL && checkPt->next != NULL;
     checkPt = checkPt->next)
{
   /* Nothing to do here. */
}

if( checkPt != NULL )
{
  struct checkPoints *np = malloc(sizeof *checkPt->next);
  scanf("%c %d %d %d %d\n", &np->dropOut, &np->currentPoint, &np->competitor, &np->hour, &np->minute);
  np->next = NULL;
  checkPt->next = np;
}
于 2012-12-14T11:12:46.033 に答える
0

あなたはテールノードのメモリを上書きしています。

一時ノードを作成する必要があります。

checktmp = (struct checkPoints*)malloc(sizeof (struct checkPoints));

次に、一時ノードをテールに追加します。

checkPt->next = checktmp;

于 2012-12-14T11:15:21.663 に答える