Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Theoretische Informatik » formale Sprachen » einfach verkettete Listen Fehlermeldung: Warnung: Zuweisung an ListElement von imkompatiblem Zeigert » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen einfach verkettete Listen Fehlermeldung: Warnung: Zuweisung an ListElement von imkompatiblem Zeigert
Beiträge zu diesem Thema Autor Datum
 einfach verkettete Listen Fehlermeldung: Warnung: Zuweisung an ListElement von imkompatiblem Zeigert smon 08.06.2022 12:48
 RE: einfach verkettete Listen Fehlermeldung: Warnung: Zuweisung an ListElement von imkompatiblem Zeigert as_string 23.06.2022 14:14

Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
smon
Grünschnabel


Dabei seit: 08.06.2022
Beiträge: 1

einfach verkettete Listen Fehlermeldung: Warnung: Zuweisung an ListElement von imkompatiblem Zeigert Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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?

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von smon: 08.06.2022 12:54.

08.06.2022 12:48 smon ist offline E-Mail an smon senden Beiträge von smon suchen Nehmen Sie smon in Ihre Freundesliste auf
as_string as_string ist männlich
Haudegen


Dabei seit: 06.11.2013
Beiträge: 639
Herkunft: Heidelberg

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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
23.06.2022 14:14 as_string ist offline E-Mail an as_string senden Beiträge von as_string suchen Nehmen Sie as_string in Ihre Freundesliste auf
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Theoretische Informatik » formale Sprachen » einfach verkettete Listen Fehlermeldung: Warnung: Zuweisung an ListElement von imkompatiblem Zeigert