Создание связанного списка с несколькими типами элементов - PullRequest
0 голосов
/ 09 декабря 2018

Мой курс C прошел в финале на прошлой неделе, и до конца семестра у нас осталось еще 1 неделю занятий, и мой профессор решил отменить остальные классы.

У меня былоспросил его, почему он не использовал это время, чтобы научить нас связным спискам, и он сказал: «Финал уже дан, поэтому мне не нужно учить чему-то другому».

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

Проще говоря, у меня есть текстовый файл с такими строками:

Apple     //name   
12        //quantity   
23.90     //price   
Bananas   //name  
4         //quantity  
12.90     //price

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

Пример моей структуры:

typedef struct
{
char food_name[BUF];
int food_quantity;
float food_cost;
}FOOD;

Я хотел бы опубликовать оставшуюся часть моего кода в качестве примера, но, поскольку у меня еще есть 2 года, оставшиеся после колледжа, и у меня уже есть тот же профессор, упомянутый выше в течение следующих 3 семестров, я не будуНе рискуйте академической нечестностью и потенциальными учениками следующего года, которые берут мой домашний ответ (см. HW3, если кто-нибудь из этого класса в следующем году увидит это)

Ответы [ 2 ]

0 голосов
/ 09 декабря 2018

Вот некоторый грубый код, с которого можно начать, я лениваюсь и пренебрегаю освобождением выделенной памяти FOOD.

Я учусь лучше всего при трассировке примеров.Я призываю вас обратить пристальное внимание на значения, отображаемые указателями (% p в различных printfs).Например, откуда next = 0xa22070 взято из name = "Cherries" qty = 8 cost = 1.23 next = 0xa22070 ?

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

Удачи в обучении: -)

выход

$ gcc food.c 
$ ./a.out
--- directly calling print_food() ---
FOOD addr=0xa22010  name="Apple" qty=12 cost=23.90 next=(nil)
FOOD addr=0xa22070  name="Bananas" qty=4 cost=12.90 next=0xa22010
FOOD addr=0xa220d0  name="Cherries" qty=8 cost=1.23 next=0xa22070
--- calling print_food_list() ---
food list #001: FOOD addr=0xa220d0  name="Cherries" qty=8 cost=1.23 next=0xa22070
food list #002: FOOD addr=0xa22070  name="Bananas" qty=4 cost=12.90 next=0xa22010
food list #003: FOOD addr=0xa22010  name="Apple" qty=12 cost=23.90 next=(nil)
Done, n=3
$ 

food.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define BUF 64

typedef struct food
{
   char  name[BUF];
   int   quantity;
   float cost;
   struct food  *next; // ptr to next food, otherwise null.
} FOOD;

FOOD *make_food(char *name, int quantity, float cost, FOOD *next) {
    FOOD *p = malloc(sizeof(FOOD));
    strcpy( p->name, name);
    p->quantity = quantity;
    p->cost = cost;
    p->next = next;
    return p;
}

void print_food(FOOD *p) {
    printf("FOOD addr=%p  name=\"%s\" qty=%d cost=%.2f next=%p\n",
        p, p->name, p->quantity, p->cost, p->next);
}

int print_food_list(FOOD *p) {
    int length = 0;
    while( p ) {
        ++length;
        printf("food list #%03d: ", length); // note lack of \n
        print_food(p);
        p = p->next;
    }
    return length;
}

void main(int argc, char** argv) {
    FOOD *a = make_food( "Apple", 12, 23.90, (FOOD *)NULL );
    FOOD *b = make_food( "Bananas", 4, 12.90, a);
    FOOD *c = make_food( "Cherries", 8, 1.23, b);
    printf("--- directly calling print_food() ---\n");
    print_food(a);
    print_food(b);
    print_food(c);
    printf("--- calling print_food_list() ---\n");
    int n = print_food_list(c);
    // int n = print_food_list(a); // what would happen with a?
    printf("Done, n=%d\n", n);
}
0 голосов
/ 09 декабря 2018

Связанный список вашей структуры имеет дополнительный указатель на следующую структуру, чтобы соединить одну структуру с другой.Простой одиночный связанный список выглядит так:

typedef struct food_s {
  char  food_name[BUF];
  int   food_quantity;
  float food_cost;
  struct food_s *next;
}food_t;

Это только небольшое начало, но есть несколько книг, описывающих связанный список, двойные связанные списки, двоичные деревья и т.д. отсортированные списки, ...

...