0

私は2つの異なるスタックを持っています

    typedef struct name {

    char*markerName;
    struct test *next;

}name_t;

 typedef struct test {

    int grade;
    int studentNumber;
    struct test *next;


}test_t;

そしてこの機能

void test(name_t* marker1,int data)
{
        test_t *temp= malloc(sizeof(test_t));
        test_t *location=NULL;
        temp->grade=data;
        temp->next=NULL;
        location=marker1->next;
        if(location==NULL)
        {
        //  printf("%i \n",temp->grade);
            marker1->next=temp;
        }
        else
        {
            while(location!=NULL)
            {
                printf("%i \n",location->grade);
                printf("%p \n",location->next);
                location=location->next;
            }
            location=temp;
        }
}

問題は、スタクト名の配列を作成し、配列の各要素の後にテストのリンクされたリストを作成していることです。構造体名のノードをスタクト ​​テストにリンクするにはどうすればよいですか?

次を印刷しましたが、NULLポインターを指し続けます。

4

4 に答える 4

1

リンクされたリストの最後を超えてオーバーシュートしています。変数は 'NULL' になりますlocation。これは、割り当てられたとしても、関数が終了するとコンテキストから外れるローカル変数のままです。while ループは次のようになります。

while(location->next != NULL)
{
    printf("%i \n",location->grade);
    printf("%p \n",location->next);
    location = location->next;
}

location->next = temp;
于 2013-03-27T17:59:35.250 に答える
1

2 種類のネクスト ポインターを持つ構造体はどうでしょうか。1 つは name_t 型、もう 1 つは test_t 型です。リンクに必要なものを使用し、もう一方を NULL のままにすることができます。あなたの質問を正しく理解できたことを願っています。

于 2013-03-27T17:59:46.553 に答える
1

厳密に言えば、連結リストには 1 つのデータ型のみを含めることができます。両方の構造型を含むリストが必要な場合は、共用体を使用してこれをエミュレートできます。

struct name {
   char* markerName;
};

struct test {
   int grade;
   int studentNumber;
};

// Indicates the type of data stored in the union
enum dtype { NONE, NAME, TEST };

// Combination of the above structures, suitable for a mixed-type list
struct combo {
   struct combo*   next; // Next structure in the linked list
   enum dtype      type; // Indicates which of the union fields is valid
   union {
      struct name  name;
      struct test  test;
   };
};

これにより、両方のデータ セットが 1 つの構造体に格納され、構造体からリストを作成できるようになり、現在有効なデータの種類を追跡できるようになります。

于 2013-03-27T18:12:32.760 に答える
0

タイプへのポインターを使用できますvoid。もちろん、これは次のオブジェクトの型を何らかの方法で知っていることを前提としています。

異種のデータ構造を作成する場合は、構造体型のノードを 1 つだけ持ち、ノードに 2 つの「ペイロード」変数 (ノードの型を示す 1 つと構造体へのポインター) を持つ方が賢明かもしれません。実際のデータで。

于 2013-03-27T17:53:50.477 に答える