Односвязный список в список

387
19 декабря 2016, 19:56

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

Заранее спасибо за ответы.

Во втором списке значения переменных int первого списка разные.

P.S. Я студент, только учусь, поэтому всякие умнячие слова не используйте.

Answer 1

Измените указатель на следующий элемент последнего элемента первого списка с NULL на адрес первого элемента второго списка.

UPDATE

Структуры данных для списка складов. Склад представлен списком товаров.

Списки односвязные. Элементы запоминаются в "порядке стека".

struct product {
  struct product *next;
  char *title;
  int  qty;
};
struct store {
  struct store *next;
  char *title;
  struct product *prod_list;
};
....
struct store *stores_list;
....
int main (int ac, char *av[])
{
  // пусть каждый склад в своем файле
  // прочтем все склады
  struct store *stores_list = 0, *t;
  for (int i = 1; i < ac; i++) {
    t = get_store(av[i]);
    t->next = stores_list;
    stores_list = t;
  }
....
}

Чтение продуктов и построение их списка для каждого склада аналогично.

Для краткости все проверки опущены.

struct strore *get_store (char *fname)
{
    // допустим первая строка файла название склада, далее строки с товарами 
    // для простоты в формате NNN название товара
    FILE *in = fopen(fname, "r");
    char buf[4096];
    fgets(buf, 4096, in);
    struct store *store = (struct store *)malloc(sizeof(*store));
    store->title = strdup(buf);
    store->prod_list = 0;
    while(fgets(buf, 4096, in) != EOF) {
      char *p;
      struct product *p = (struct product *)malloc(sizeof(*p));
      p->qty = strtol(buf, &p, 10);
      p->title == strdup(p+1);  // по хорошему надо искать начало названия продукта "поточнее"
      p->next = store->prod_list;
      store->prod_list = p;
    }
    fclose(in);
    return store;
}

Код не поверял, но д.б. как-то так.

Answer 2

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

Вот немного псевдокода.

// ваш первый список
class FirstListNode {
    FirstListNode *next;
    int intValue;
    char *stringValue;
};
class FirstList {
    FirstListNode *head;
    // methods
};
// ваш второй список
class SecondListNode {
    char *stringValue;
    FirstList *list;
};
class SecondList {
    SecondListNode *head;
};

Надеюсь я правильно понял Ваш вопрос.

READ ALSO
Изъятия текста из диалогового окна (winApi)

Изъятия текста из диалогового окна (winApi)

Почему, когда я считываю текст из BoxEditor диалогового окна, или же вызываю диалог открытия/сохранения файла, то текст у меня сохраняется в элементы...

355
Потери данных при записи аудио потоков (Linux 64bit)

Потери данных при записи аудио потоков (Linux 64bit)

Уважаемые профи! Написал программу записи нескольких потоков аудио данных с АЦП(специальная плата PCI)Программа работает, но при прослушивании...

297
C++ сервер - клиент [закрыто]

C++ сервер - клиент [закрыто]

Подкиньте литературки по поводу общения клиент - сервер - клиентОтправка текстовой информации

314
Распарсить XML

Распарсить XML

Добрый деньПомогите, пожалуйста? средствами Qt или других C++ библиотек распарсить XML ответ сервера в таком виде

289