0

構造の連結リストを作成したのですが、何らかの理由で別のリンクを追加するたびに先頭アドレスが変更されますが、y 先頭アドレスを最初のエントリにしたいです。これは私のコードです:

struct checkPoints *tgh = NULL;
struct checkPoints **linkedlist = &tgh;
struct checkPoints *cp = malloc(sizeof (struct checkPoints));
chPo = fopen(fileName, mode);
if (chPo == NULL) {
    printf("Can't find the files.");
    exit(1);
} else {
    for (i = 0; i < lines; i++) {

        fscanf(chPo, "%c %d %d %d:%d\n", &cp->dropOut, &cp->currentPoint, &cp->competitor, &cp->hour, &cp->minute);
        cp->next = NULL;
        if (*linkedlist == NULL) {
            printf("ONCE");
            *linkedlist = cp;
        } else {
            struct checkPoints *new = *linkedlist;
            while (new->next != NULL) {
                new = new->next;
            }
            new->next = cp;
        }
    }
}

fscanf が発生するたびに、ヘッドアドレスが次のアドレスに変更されます。何かアイデアはありますか?

次の行の後、ヘッド アドレスが変更されます。fscanf(chPo, "%c %d %d %d:%d\n", &cp->dropOut, &cp->currentPoint, &cp->competitor, &cp->hour, &cp->minute);

構造は次のとおりです。

struct checkPoints{
char dropOut;
int currentPoint;
int competitor;
int hour;
int minute;
struct checkPoints *next;
};
4

4 に答える 4

2

ここでの問題は、新しいノードを割り当てず、何度も変更するノードが 1 つしかないことです。ループ内にノードを割り当てる必要があります。

于 2012-12-14T09:02:39.053 に答える
1

リストに追加される新しいノードを作成するための malloc/calloc が表示されません。

リストに追加される新しいノードを作成する必要があります。正しい位置は直前だろう

    cp->next = NULL;

ライン

于 2012-12-14T09:03:12.417 に答える
0

あなたの場合、単一のノードを割り当て、同じアドレスにデータを上書きしています。

ループ内の新しいノードにメモリを割り当てる必要があります。

次の行をループの先頭に追加する必要があります。

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

于 2012-12-14T09:14:07.613 に答える
0

struct checkPoints読む行ごとに新鮮なものを割り当てる必要があります。次のようなループが得られます。

struct checkPoints *linkedlist = NULL;
/* … */
for (i = 0; i < lines; i++) {
    struct checkPoints *cp = malloc(sizeof(struct checkPoints));
    fscanf(chPo, "%c %d %d %d:%d\n", &cp->dropOut, &cp->currentPoint, &cp->competitor, &cp->hour, &cp->minute);
    cp->next = NULL;
    if (linkedlist == NULL) {
        linkedlist = cp;
    } else {
        struct checkPoints *new = linkedlist;
        while (new->next != NULL) {
            new = new->next;
        }
        new->next = cp;
    }
}

この方法は、行ごとにリスト全体を再度スキャンする必要があるため、非常に非効率的であることに注意してください。whileループなしで追加できるように、リストの末尾へのポインターを保持する必要があります。賢明な代替手段は、各行をリストの先頭に追加し、ファイル全体を読み取ったら、リスト全体を逆にすることです。

struct checkPoints *cp;
for (i = 0; i < lines; i++) {
    cp = malloc(sizeof(struct checkPoints));
    fscanf(chPo, "%c %d %d %d:%d\n", &cp->dropOut, &cp->currentPoint, &cp->competitor, &cp->hour, &cp->minute);
    cp->next = linkedlist;
    linkedlist = cp;
}
cp = linkedlist;
linkedlist = NULL;
struct checkPoints *next = cp;
while (cp) {
    next = cp->next;
    cp->next = linkedlist;
    cp = next;
}
于 2012-12-14T09:05:32.763 に答える