einfach verkettete Listen Fehlermeldung: Warnung: Zuweisung an ListElement von imkompatiblem Zeigert

Neue Frage »

Auf diesen Beitrag antworten »
smon einfach verkettete Listen Fehlermeldung: Warnung: Zuweisung an ListElement von imkompatiblem Zeigert

Meine Frage:
hallo an alle, hat jemand vielleicht lust/zeit mir zu helfen? ich übe gerade mit einfach verketteten listen in c umzugehen und habe dafür folgenden code:






Meine Ideen:

/*linked list*/

#include <stdio.h>
#include <stdlib.h>

typedef struct {
int key;
struct ListElement *next;
} ListElement;

typedef struct {
ListElement *first;
} List;

void insert_Element (ListElement *newElement, List *list) {
ListElement *temp;
temp = list->first;
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = newElement;
}

void delelte_Element(ListElement *delElement, List *list) {
ListElement *temp;
ListElement *del;
temp = list->first;

if (temp == delElement) {
list->first = temp->next;
free(temp);
return;
}

while (temp != NULL) {
if(temp->next ==delElement) {
del = temp->next;
temp->next = del->next;
free(del);
}
temp = temp->next;
}
}

void print_list(List * list) {
ListElement *temp;
temp = list->first;
while(temp != NULL) {
printf("%d\n", temp->key);
temp = temp->next;
}
printf("--------------");
}

int main () {

List list;

ListElement *a;
a = malloc(sizeof(ListElement));
a->key = 10;
a->next = NULL;

list.first =a; //unser erstes Element ist a

ListElement *b;
b = malloc(sizeof(ListElement));
b->key = 15;
b->next = NULL;

print_list(&list);
return 0;
}

leider kommt bei dem versuch der compilierung folgende warnung

Warnung: Zuweisung an »ListElement *« von inkompatiblem Zeigertyp »struct ListElement *« [-Wincompatible-pointer-types]
| del = temp->next;

kann mir jemand von euch weiterhelfen?
 
Auf diesen Beitrag antworten »
as_string

Ich glaube, das Problem ist, dass Du zwischen dem typedef und einem struct unterscheiden musst.
Das struct von Deinem ListElement hat nämlich selbst gar keinen Namen, allerdings wird mit dem typedef ein Typ ListElement definiert, der sich auf diesen anonyme struct bezieht.
Also man kann eine struct ja z. B. so definieren:
code:
1:
2:
3:
4:
5:
6:
struct struct_name {
    int a;
    float b;
};

Das ist dann eine struct, die Du verwenden kannst, indem Du eine Variable so definierst:
code:
1:
2:
3:
struct struct_name struct_var;

Weil das keyword "struct" vorne dran unschön ist, kann man auch ein typedef verwenden (und macht man üblicherweise auch), in der Art:
code:
1:
2:
3:
4:
5:
6:
typedef struct struct_name {
    int a;
    float b;
} structName;

Also quasi dasselbe wie oben, nur vorne dran ein "typedef" und bevor man das allerletzte Semicolon schreibt noch den Namen des neuen Typs, hier also "structName". Wenn Du das gemacht hast, kannst Du in Zukunft statt "struct struct_name" einfacher nur "structName" schreiben und alles fühlt sich auch eher wie ein normaler eingebauter Datentyp an.

Du hast aber geschrieben:
code:
1:
2:
3:
4:
5:
6:
typedef struct {
    int key;
    struct ListElement *next;
} ListElement;

Aber "struct ListElement" gibt es nicht, die struct selber hat keinen Namen und definiert nur den Typ ListElement, nicht "struct ListElement". Deshalb kannst Du danach auch ListElement verwenden, aber das Problem ist jetzt hier, dass Du das eben noch nicht bei der Definition der struct selbst verwenden kannst, weil der Compiler das ja noch gar nicht kennt (so ne Art Henne-Ei-Problem).
Was Du am einfachsten machen kannst, ist, sowohl der struct selbst einen Namen zu geben, als auch das typedef zu machen. Dann aber bei der Definition der struct selbst nur den struct-Namen zu verwenden, also so meine ich das:
code:
1:
2:
3:
4:
5:
6:
typedef struct list_element {
    int key;
    struct list_element *next;
} ListElement;


Damit sollte es dann gehen. Ich muss aber ehrlich zugeben, dass ich da selbst nicht so den kompletten Durchstieg hab. Im Detail ist das alles recht verwirrend...

Gruß
Marco
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »