0

ポインターを使用して、既に作成されたノードに構造体を追加しようとしています。問題は、それらを正しくリンクしていないことです。誰かが私を助けてくれることを望んでいました。パラメーターは正しく、1 つは構造体で、もう 1 つは、構造体 s に接続する新しく作成した構造体の内部に入る文字列です。

(ノード s)--->(新しいノード)-->null fileInsert() を呼び出そうとしましたが、新しいノードのデータを表示しようとすると、まだ null です。filenames は、ノード s と新しいノードをリンクするための構造体ノード ポインターです。誰かが私を正しい方向に向けることができますか?

void fileInsert(struct node *s, char *filename){
struct node *current=s->filenames;
while(current!=NULL){

    current=current->filenames;
}
struct node* f=NULL;
f=(struct node*)malloc(sizeof(struct node));
strcpy(f->data, filename);
current=f;
f->filenames=NULL;
}
4

3 に答える 3

2

これを行うには 2 つの方法があります。

1 つは、新しいノードをリストの先頭にすることです。

struct node* fileInsert(struct node *s, char *filename) {
    struct node *current=s;

    struct node* f=NULL;
    f=(struct node*)malloc(sizeof(struct node));
    strcpy(f->data, filename);
    f->filenames=current;
    return f;
}

もう1つは、それを現在のリストに追加することです。これは、あなたがやろうとしていることです。

struct node* fileInsert(struct node *s, char *filename) {
    struct node *current=s;

    if (current != null) {
        while(current->filenames!=NULL){ 
            current=current->filenames;
        }
    }
    struct node* f=NULL;
    f=(struct node*)malloc(sizeof(struct node));
    strcpy(f->data, filename);
    f->filenames=NULL;
    if (current == null) {
        current = f;
    } else {
        current->filenames = f;
    }
    return current;
}

最初のものは単純に新しいノードを作成し、次に current をポイントして、それを前に追加します。これは、current がノードまたは null の場合に機能します。

2 つ目は、リストが存在するかどうかを確認し、存在する場合は (ファイル名のヌル ポインターを検索して) リストの最後に移動し、新しいノードを追加し、存在しない場合は新しいノードをルートにします。ノード

どちらのルーチンもリストの先頭を返します。

于 2013-11-09T01:31:28.163 に答える
1

ローカル変数「current」にいくつかの値を数回割り当てていると、関数が終了し、その変数が永久に失われます。代わりに、最後に入力されたメンバーを見つけて、そのメンバーfilenamesに値を割り当て、新しく割り当てられた構造を指すようにする必要があります。

于 2013-11-09T01:29:58.000 に答える
0

ループを次のように変更します

while ( current != null && current->filename != null)

何が起こっているかというと、現在は null になりますが、null はアドレス 0x0 であるため、何もリンクしていません。最後の非 null ノードで停止したい

編集:このように描いてください

NODE1 -> NODE2 -> NODE3 -> NULL
     ^ current

ループをトラバースすると、何が起こっているのか

NODE1 -> NODE2 -> NODE3 -> NULL
         ^ current 

...

NODE1 -> NODE2 -> NODE3 -> NULL
                                                 ^ current

現在は、実際には具体的ではないメモリアドレスです。物理的な意味はありません。NULL に戻すと、ノード 1 からノード 3 に関するすべての情報が失われます

ノードを追加すると、これが得られます

NODE1 -> NODE2 -> NODE3 -> NULL

NODE4->NULL

どちらもメモリに存在しますが、接続されていません

私の携帯電話のフォーマットが悪いので申し訳ありません

于 2013-11-09T01:31:53.247 に答える