2010-03-29 3 views
2

Я пытаюсь создать связанный список с двумя отдельными списками в одной структуре. То есть, он имеет значение «имя» и «возраст». Затем программа может либо вывести список, отсортированный по имени, либо отсортированный по возрасту. Поэтому мне нужны два связанных списка.Прохождение структур по ссылке? [C]

Тем не менее, мне нужна программа, чтобы знать о корневом/главном списке имен и списка возраста.

Я не уверен, как отправить это в мою функцию.

У меня уже будет имя и возраст, который я хочу добавить в каждый список, а затем как-то я должен послать ему главу каждого списка. Потому что есть две головы, которые я хочу вернуть, я не могу использовать функцию возврата. Как я могу узнать о изменениях в списках head/root?

Надеюсь, вопрос будет clea, и спасибо за ответы!

ответ

0

Вы можете просто передать указатель на указатель на две головы в качестве аргумента, а затем без каких-либо проблем изменить указатель.

void list_add(char *name, int age, list_type *list, list_type **name_head, list_type **age_head) 
{ 
    /* Add the name and age and calculate the two heads. */ 
    (*name_head) = calculated_head; 
    (*age_head) = calculated_head; 
} 
1

Вы можете обертывать обе головки одной структурой.

0
  1. Вы можете использовать указатели в качестве Королевства рыб suggested. Я просто хотел добавить, что ваша документация должна указывать на то, что эти значения являются «выходами», даже если они являются параметрами.

  2. Вы можете использовать тип данных кортежа. Вот простой:

    typedef struct Tuple{void*a,*b;}*Tuple; 
    Tuple tuple(void*a,void*b){ 
        Tuple z=malloc(sizeof(struct Tuple)); 
        z->a=a,z->b=b; 
        return z; 
    } 
    

    Остерегайтесь, однако, что отслеживание динамического распределения памяти может быть трудно, и если вы не используете garbage collector, вам нужно быть очень осторожным.

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

    struct Person;typedef struct Person*Person; 
    struct Person{Person*prev_by_name,*next_by_name,*prev_by_age,*next_by_age; ...}; 
    

    Добавление дополнительных индексов (связные списки) становится тривиальным, и если вы даете ему некоторые мысли, вы можете сделать препроцессор сделать большую часть работы вы.

    Этот метод также дает возможность задавать «кто следующий-молодым человеком после того, как Дэйв»

    Наконец, путем продевания индексы в этом случае все обновления индексов человека будут храниться вместе, что позволит избежать ошибок синхронизации.

  4. Вы можете использовать отдельные функции и просто «помнить», чтобы называть их обоих. Если это для домашней работы, и вы еще не решили, как вернуть несколько значений, то вы можете выбрать это «решение» просто потому, что это, вероятно, то, что ищет ваш учитель.

1

Вы можете связать один элемент списка в два списка и сортировать их независимо друг от друга:

/* List item is linked into two lists */ 
struct list 
{ 
    struct list* name_next; /* next in name list */ 
    struct list* age_next; /* next in age list */ 

    char* name; 
    unsigned age; 
}; 

/* Holds both list heads */ 
struct book 
{ 
    struct list* name_sorted; 
    struct list* age_sorted; 
};