Liste in Funktion initialisieren

OP #2467436
Lesenswert?
• ▲
▼
hallo, ich habe eine Funktion, mit der ich für eine einfach verkette 
Liste Speicher dynamisch anfordere in C.
nun möchte ich meine Liste initialisieren, schaffe es aber leider nicht.


int allocateListMemory(List **list)
{
....malloc(...)
...
*list->header.identifier = INITIALISATION_CONSTANT_ZERO;
...
*list->next = NULL;
}

Ich möchte nicht gerade eine zweite Liste erzeugen und diese dann der 
Liste list zuweisen, sondern gleich für die Liste **list Speicher 
anfordern?
Ist das irgendwie möglich und wenn ja wie?
OP #2467462
Lesenswert?
• ▲
▼
int allocateListMemory(List **list)
{
  if(!(*list = malloc(sizeof(List))))
  {
    *list = NULL;
    return OUT_OF_MEMORY_ERROR;
  }
  *list->content.place_name = NULL;
  *list->content.description = NULL;
  *list->header.identifier = INITIALISATION_CONSTANT_ZERO;
  *list->header.latitude = INITIALISATION_CONSTANT_ZERO;
  *list->header.longitude = INITIALISATION_CONSTANT_ZERO;
  *list->header.content_length = INITIALISATION_CONSTANT_ZERO;
  *list->next = NULL;
  return NO_ERROR;
}

mein Problem liegt nach dem if, und zwar will ich hier place.name, ... 
auf Null initialisieren, nur ich bin leider in C ne volle Niete und weiß 
nicht, wie das richtig geht.
OP #2467468
Lesenswert?
• ▲
▼
typedef struct Header
{
  unsigned int identifier;
  double latitude;
  double longitude;
  unsigned int content_length;
}
Header;

typedef struct Content
{
  char *place_name;
  char *description;
}
Content;

typedef struct List
{
  struct List *next;
  Header header;
  Content content;
}
List;

List, Content und Header sollte nicht unterstrichen sein, dass macht 
leider die Formatierung so.
#2467497
Lesenswert?
• ▲
▼
Ich regel das immer so:
1
typedef struct item {
2
        struct item* next;
3
        int id;
4
} item;
5

6
typedef struct List {
7
        item* head;
8
} List;
9

10
List* List_create() {
11
        List* liste = malloc(sizeof(List));
12
        liste->head = NULL;
13
        return liste;
14
}
15
int main (int argc, const char * argv[]) {
16
        List* liste = List_create();
17
        return 0;
18
}
Vielleicht hilft es dir zum Anpassen.
#2467575
Lesenswert?
• ▲
▼
Hans M. schrieb:
> int allocateListMemory(List **list)

Du kannst keine Liste übergeben, weil du sie ja erstellen möchtest.
1
typedef struct Header
2
{
3
  unsigned int identifier;
4
  double latitude;
5
  double longitude;
6
  unsigned int content_length;
7
}
8
Header;
9

10
typedef struct Content
11
{
12
  char *place_name;
13
  char *description;
14
}
15
Content;
16

17
typedef struct List
18
{
19
  struct List *next;
20
  Header header;
21
  Content content;
22
}
23
List;
24

25
List* allocateListMemory()
26
{
27
  List* list = malloc(sizeof(List));
28
  if(list == NULL) {
29
    //OUT_OF_MEMORY_ERROR
30
  } else {
31
    list->content.place_name = NULL;
32
    list->content.description = NULL;
33
    list->header.identifier = INITIALISATION_CONSTANT_ZERO;
34
    list->header.latitude = INITIALISATION_CONSTANT_ZERO;
35
    list->header.longitude = INITIALISATION_CONSTANT_ZERO;
36
    list->header.content_length = INITIALISATION_CONSTANT_ZERO;
37
    list->next = NULL;
38
  }
39
  return list;
40
}
41

42
int main (int argc, const char * argv[]) {
43
  List* list = allocateListMemory();
44

45
  return 0;
46
}

Falls du irgendwann weitere Elemente hinzufügen möchtest (was man ja 
meistens bei einer Liste tun möchte ^^) musst du das erste Element der 
Liste identifizieren können.
Persönliche Seite #2467635
Lesenswert?
• ▲
▼
Christian Q. schrieb:
> Okay ab hier muss ich mich ausklinken.

Wo ist das Problem? Was wird denn da übergeben?

Ein Pointer auf einen Pointer.

Und der kann dereferenziert werden,
1
void allocateListMemory(List** list)
2
{
3
  *list = malloc(sizeof(List));
4
  if(*list == NULL) {
5
    //OUT_OF_MEMORY_ERROR
6
  } else {
7
    (*list)->content.place_name = NULL;
8
    (*list)->content.description = NULL;
9
    // etc.
10
  }
11
}
12

13
int main (int argc, const char * argv[]) {
14
  List* list;
15

16
  allocateListMemory(&list);
17

18
  return 0;
19
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren