-3

リンクリストのノード内にあるリスト属性に要素を追加する方法、特にポインターの設定方法を理解するのに苦労しています。

私はそのような構造体を持っています:

typedef struct Node
{
    int value;
    struct Node *elements;
    struct Node *next;
}Node;
 Node *mainlist;
 Node *elemlist;

そして、メインリストで特定のノードを見つけて、elemlistのすべての要素をそのノード*要素に追加できるようにしたいと思います。

メインリストとチェックする値を受け取るこの関数があります:

void add_elements(Node *mainlist, int value)
{
    Node *ptr = mainlist;
    Node *ptr2 = elemlist;
    while(ptr != NULL)
    {
            if(value == ptr->value)
            {
                    while(ptr2 != NULL)
                    {
                            Node *newNode = malloc(sizeof(Node));
                            newNode->value = ptr2->value;
                            newNode->next = ptr->elements;
                            ptr->elements = newNode;
                            ptr2 = ptr2->next;
                    }
            }
            ptr = ptr->next;
    }
}

セグメンテーション違反が発生しているため、elemlistの要素がノードの要素に追加されていないことは明らかです。私は自分のポインタで何か間違ったことをしているとかなり確信しています。

これに関する助けをいただければ幸いです。ありがとうございました!

4

4 に答える 4

1

newNodeに対してmallocを呼び出した直後に、そのnewNodeのとアイテムを初期化する必要がvalueありnextます

しかし、あなたは変更してNode->valueいますが、変更する必要がありますnewNode->value


に置き換える必要がありNode->value = ptr2->value;ますnewNode->value = ptr2->value;

于 2012-10-24T08:00:29.020 に答える
1

セグメンテーション違反は、内側のwhileループが実行された後に発生するようです。そのため、ptr2はリンクリストの最後を指しています。次に、2番目のループが再度実行されると、無効なメモリにアクセスしています。内側のループの後でptr2をリセットしてみてください。

以下のようなので

void add_elements(Node *mainlist, int value)
{
    Node *ptr = mainlist;
    Node *ptr2 = elemlist;
    Node *tmp = ptr2;
    while(ptr != NULL)
    {
            if(value == ptr->value)
            {
                    while(ptr2 != NULL)
                    {
                            Node *newNode = malloc(sizeof(Node));
                            newNode->value = ptr2->value;
                            newNode->next = ptr->elements;
                            ptr->elements = newNode;
                            ptr2 = ptr2->next;
                    }
                     ptr2 = tmp;
            }
            ptr = ptr->next;
    }
}
于 2012-10-24T08:00:43.223 に答える
1

私はこう思います:

     Node->value = ptr2->value;

これである必要があります:

    newNode->value = ptr2->value;
于 2012-10-24T07:52:54.710 に答える
0

segFault がある理由はわかりませんが、それは未定義のポインター アドレスで newNode->next (またはない) を設定しているためです。

typedef struct Node{
int value;
struct Node *elements;
struct Node *next;

}ノード;

ノード *メインリスト; ノード *elemlist;

void add_elements(Node* mainlist, int value){
    Node* ptr  = mainlist;
    Node* ptr2 = elemlist;
    while(ptr != NULL)
    {
        printf("* %u\n", ptr->value);
        if(value == ptr->value)
        {
            while(ptr2 != NULL)
            {
                Node *newNode = malloc(sizeof(Node));
                newNode->value  = ptr2->value;
                newNode->next   = ptr->elements;
                ptr->elements   = newNode;
                ptr2            = ptr2->next;
            }
        }
        ptr = ptr->next;
    }
}

int main(int argc, const char * argv[]){

        Node* node = calloc(1, sizeof(Node));
        Node* node2 = calloc(1, sizeof(Node));
        node->next = node2;
        node2->value = 17;
        add_elements(node, 2);
    }
    return 0;
}

機能しています(関数の外側に要素を追加したとしても;)、しかしそれを練習として取ってください)

于 2012-10-24T08:06:23.270 に答える