jwvai316 wrote:
I don't really know how to say it so I just say it a nested linklist.
How do you make LinkLists inside LinkList?
Can anyone help me for this?
I think an example program will help me a lot.
/* BEGIN listolists.c output */
Man number 1
Name: Iofo
Age : 32
Phone numbers:
163-4945
434-9890
785-6541
432-9672
Man number 2
Name: Eblf
Age : 36
Phone numbers:
945-4349
890-7856
541-4329
672-3216
Man number 3
Name: Fjut
Age : 24
Phone numbers:
349-8907
Man number 4
Name: Vsfg
Age : 24
Phone numbers:
907-8565
414-3296
723-2165
238-3036
381-0527
Man number 5
Name: Wfgn
Age : 20
Phone numbers:
565-4143
296-7232
165-2383
/* END listolists.c output */
/* BEGIN listolists.c */
#include <stdio.h>
#include <stdlib.h>
#define PEOPLE_MAX 5
#define NUMBERS_MAX 3
#define NAME_LENGTH 5
#define UPPER "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
#define LOWER "abcdefghijklmnopqrstuvwxyz"
#define LU_RAND_SEED 123456789LU
#define LU_RAND(S) ((S) * 69069LU + 362437 & 0xffffffff)
struct list_node {
struct list_node *next;
void *data;
};
typedef struct list_node list_type;
struct person {
char name[NAME_LENGTH + 1];
int age;
list_type *phone_numbers;
};
list_type *list_make(long unsigned count);
list_type *man_init(list_type *node, long unsigned seed);
list_type *number_init(list_type *node, long unsigned seed);
void make_name(char *name, size_t length, long unsigned seed);
void man_print(list_type *node);
void number_print(list_type *node);
void list_free(list_type *node, void (*free_data)(void *));
void person_free(void *data);
int main(void)
{
list_type *head;
long unsigned seed = LU_RAND_SEED;
puts("/* BEGIN listolists.c output */");
head = list_make(1 + seed % PEOPLE_MAX);
if (head == NULL) {
fputs("No list\n", stderr);
}
seed = LU_RAND(seed);
head = man_init(head, seed);
man_print(head);
list_free(head, person_free);
puts("\n/* END listolists.c output */");
return 0;
}
list_type *list_make(long unsigned count)
{
list_type *node, *list;
list = count != 0 ? malloc(sizeof *list) : NULL;
if (list != NULL) {
node = list;
while (--count != 0) {
node -> data = NULL;
node -> next = malloc(sizeof *node -> next);
if (node -> next == NULL) {
list_free(list, free);
return NULL;
} else {
node = node -> next;
}
}
node -> data = NULL;
node -> next = NULL;
}
return list;
}
list_type *man_init(list_type *node, long unsigned seed)
{
list_type *head;
struct person man;
head = node;
while (node != NULL) {
node -> data = malloc(sizeof man);
if (node -> data == NULL) {
fputs("man_init malloc problem\n", stderr);
head = NULL;
break;
}
seed = LU_RAND(seed);
make_name(man.name, NAME_LENGTH, seed);
seed = LU_RAND(seed);
man.age = 20 + seed % 20;
seed = LU_RAND(seed);
man.phone_numbers = list_make(1 + seed % PEOPLE_MAX);
if (man.phone_numbers == NULL) {
fputs("man.phone_numbers == NULL\n", stderr);
head = NULL;
break;
}
seed = LU_RAND(seed);
if (number_init(man.phone_numbers, seed) == NULL) {
fputs("man_init(man.phone_numbers, seed) == NULL\n",
stderr);
head = NULL;
break;
}
*(struct person *)node -> data = man;
node = node -> next;
}
return head;
}
list_type *number_init(list_type *node, long unsigned seed)
{
list_type *head;
size_t count;
char *string;
head = node;
while (node != NULL) {
node -> data = malloc(sizeof "xxx-xxxx");
if (node -> data == NULL) {
fputs("number_init malloc problem\n", stderr);
head = NULL;
break;
}
string = node -> data;
count = sizeof "xxx-xxxx" - 1;
while (count-- != sizeof "-xxxx" - 1) {
seed = LU_RAND(seed);
*string++ = (char)('0' + seed % 10);
}
*string++ = '-';
while (count-- != 0) {
seed = LU_RAND(seed);
*string++ = (char)('0' + seed % 10);
}
*string = '\0';
node = node -> next;
}
return head;
}
void man_print(list_type *node)
{
long unsigned count;
struct person *man;
for (count = 1; node != NULL; ++count) {
man = node -> data;
printf(
"\n%5c Man number %lu\n"
"Name: %s\n"
"Age : %d\nPhone numbers:\n",
' ', count, man -> name, man -> age
);
number_print(man -> phone_numbers);
node = node -> next;
}
}
void number_print(list_type *node)
{
while (node != NULL) {
printf(" %s\n", (char *)node -> data);
node = node -> next;
}
}
void make_name(char *name, size_t length, long unsigned seed)
{
length = length / 2 + seed % (length / 2);
*name++ = UPPER[seed % sizeof UPPER];
while (length-- != 0) {
seed = LU_RAND(seed);
*name++ = LOWER[seed % sizeof LOWER];
}
*name = '\0';
}
void list_free(list_type *node, void (*free_data)(void *))
{
list_type *next_node;
while (node != NULL) {
next_node = node -> next;
free_data(node -> data);
free(node);
node = next_node;
}
}
void person_free(void *data)
{
list_free(((struct person *)data) -> phone_numbers, free);
free(data);
}
/* END listolists.c */
--
pete