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 » Antwort erstellen » Hallo Gast [Anmelden|Registrieren]

Antwort erstellen
Benutzername: (du bist nicht eingeloggt!)
Thema:
Nachricht:

HTML ist nicht erlaubt
BBCode ist erlaubt
Smilies sind erlaubt
Bilder sind erlaubt

Smilies: 21 von 33
smileWinkDaumen hoch
verwirrtAugenzwinkerngeschockt
Mit ZungeGottunglücklich
Forum Kloppebösegroßes Grinsen
TanzentraurigProst
TeufelSpamWillkommen
LehrerLOL HammerZunge raus
Hilfe 
aktuellen Tag schließen
alle Tags schließen
fettgedruckter Textkursiver Textunterstrichener Text zentrierter Text Hyperlink einfügenE-Mail-Adresse einfügenBild einfügen Zitat einfügenListe erstellen CODE einfügenPHP CODE farbig hervorheben
Spamschutz:
Text aus Bild eingeben
Spamschutz

Die letzten 2 Beiträge
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
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?