2013-03-27 3 views
0

У меня есть 2 разного stuctКак бы вы связать связанный список с различными структурами

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; 
     } 
} 

проблема мы создаем массив с именем stuct и создавая связанный список теста после КАЖДОГО ЭЛЕМЕНТА МАССЫ. Как связать узел имени структуры с тестом stuct?

Я напечатал следующий, и они продолжают указывать указатель NULL.

ответ

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; 
    }; 
}; 

Хранит оба набора данных в единой структуре, позволяет составлять списки из структур, а также позволяет для отслеживания того, какой тип данных в настоящее время действителен.

+0

, так что нет возможного способа запустить связанный список с головой одного типа и остальной частью тела другого типа, кроме этого метода? – user2135885

+0

о, спасибо, Союз помогает много. Я ненавижу, когда учебник просто дает вам код (и половину его), и предположим, что мы все c волшебником и можем понять, о чем они говорят. Этот союз делает трюк красиво Еще раз спасибо – user2135885

+0

@ user2135885- Если ваш список будет содержать ровно одно 'struct name' в верхней части списка, а все остальное -' struct test', тогда подход на основе объединения не нужен. У вас может быть одно «struct name», которое имеет указатель на список объектов «struct test» («name» не будет частью списка, он просто укажет на него). Однако, если вам требуется больше одного типа структуры, вам понадобится нечто более сложное (например, объединение). – bta

0

Вы можете использовать указатель для ввода void. Это, конечно же, предполагает, что вы каким-то образом знаете тип следующего объекта.

Если вы хотите создать гетерогенную структуру данных, возможно, умнее иметь только один тип структурных типов узлов и иметь две переменные «полезной нагрузки» в узлах, в которой указывается тип узла и указатель на структуру с фактическими данными.

+0

как бы вы это сделали? только void * ptr в name_t и когда называть его test_t * current = (test_t *) (stuctname -> ptr)? также почему мой метод не работал? – user2135885

1

Вы находитесь за пределами вашего связанного списка. Вы получаете «NULL» для своей переменной location, которая, даже если она может быть назначена, по-прежнему является локальной переменной, которая выходит из контекста, когда ваша функция завершается. Ваш цикл в то время как должен выглядеть следующим образом:

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

location->next = temp; 
0

насчет структуры с двумя типами следующих указателей: один типа name_t и другого типа test_t. Вы можете использовать тот, который хотите связать, и оставить другой NULL. Надеюсь, я правильно понял ваш вопрос.

+0

Мне было интересно, как бы я связал их со связанным списком, всегда начинается с имени. И увеличивайте количество тестов каждый раз, когда он отмечен. Если тест не отмечен, он равен NULL. Кажется, я не могу связать имя с тестом – user2135885

Смежные вопросы