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

您超出了链接列表的末尾。您的location变量最终会得到“NULL”,即使它可以被分配,它仍然是一个局部变量,当您的函数退出时会脱离上下文。您的 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

具有两种类型的 next 指针的结构怎么样:一种是 name_t 类型,另一种是 test_t 类型。您可以使用您想要链接的一个并将另一个保留为 NULL。我希望我正确理解了你的问题。

于 2013-03-27T17:59:46.553 回答
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;
   };
};

这将两组数据存储在一个结构中,允许您从结构中创建列表,并使您能够跟踪当前有效的数据类型。

于 2013-03-27T18:12:32.760 回答
0

您可以使用指针来键入void. 当然,这假设您以某种方式知道下一个对象的类型。

当你想创建一个异构数据结构时,只有一种结构类型的节点可能更聪明,并且在节点中有两个“有效负载”变量,一个告诉你节点的类型,一个指向结构的指针与实际数据。

于 2013-03-27T17:53:50.477 回答