Willkommen |
|
myGully |
|
Links |
|
Forum |
|
|
|
 |
07.11.10, 19:04
|
#1
|
Anfänger
Registriert seit: Mar 2010
Beiträge: 9
Bedankt: 5
|
Verkettete Liste in C (DRINGEND!)
Hi, ich muss für die Uni was abgeben und hab nicht mehr viel Zeit... mal wieder viel zu spät angefangen. Mein Code sieht wie folgt aus und soll eine Verkettete Liste darstellen, die Elemente einfügt wenn sie noch nicht vorhanden sind und dann deren Wert ausgibt oda wenn sie vorhanden sind -1.
Und eine Funktion die nach dem FIFO removed.
struct glied {
int value;
struct glied *next;
}
struct glied head;
head->value = -1;
head->next = &head;
int insertElement(int value) {
struct glied *zeiger = &head;
while(zeiger->next->value != -1) {
if(zeiger->value == value) {
return -1;
}
zeiger = zeiger->next;
}
zeiger->next->value = value;
return value;
}
int removeElement() {
head->next = head->next->next;
int hilfsvariable = head->next->value;
free(head->next);
return hilfsvariable;
}
void main() {
printf(”insert 47: %d\n”, insertElement(47));
printf(”insert 11: %d\n”, insertElement(11));
printf(”insert 23: %d\n”, insertElement(23));
printf(”insert 11: %d\n”, insertElement(11));
printf(”remove: %d\n”, removeElement());
printf(”remove: %d\n”, removeElement());
}
iwie haut garnix hin und ich hab noch kaum Plan von C-.- ... bin am verzweifeln
|
|
|
07.11.10, 20:42
|
#2
|
Banned
Registriert seit: Aug 2010
Beiträge: 209
Bedankt: 70
|
"Dringend" im Betreff = Sonntagabend... morgen früh müssen also wieder die Hausaufgaben abgegeben werden
|
|
|
07.11.10, 20:56
|
#3
|
Banned
Registriert seit: Sep 2009
Ort: /root/
Beiträge: 824
Bedankt: 640
|
Oh das wird eine lange Nacht mein Freund.
Code:
int removeElement() {
head->next = head->next->next;
int hilfsvariable = head->next->value;
free(head->next);
return hilfsvariable;
}
Also das z.B. sollteste dir nochmal anschauen. Überleg mal was auf was head->next zeigt wenn du dein free() aufrufst.
|
|
|
07.11.10, 21:02
|
#4
|
Echter Freak
Registriert seit: Mar 2010
Ort: /home/spartan-b292
Beiträge: 2.856
Bedankt: 1.701
|
Vermutlich nicht genau das was du machen musst, aber ich musste sowas ähnliches auch mal für die FH machen vllt kannst du damit ja was anfangen:
Code:
#include <stdio.h>
#include <stdlib.h>
struct eintrag // Deklaration eines Listenelements
{
char wort[20];
struct eintrag *next;
};
typedef struct eintrag element;
struct eintrag *liste; //Zeiger auf den Anfang der Liste
element *erstellen (element* ptr);
element *hinzufuegen (element* ptr);
element *loeschen (element* ptr);
void anzeigen (element* ptr);
int main (void)
{
char c;
do
{
printf ("\tHAUPTMENUE:\n\n\t1 - Liste erstellen\
\n\t2 - Element hinzufuegen\n\t3 - Element loeschen\
\n\t4 - Programm beenden\n");
c=getchar();
switch (c)
{
case '1': liste = (element*)malloc(sizeof(element));
getchar();
erstellen (liste);
anzeigen (liste);
break;
case '2': getchar();
anzeigen (liste);
hinzufuegen (liste);
anzeigen (liste);
break;
case '3': getchar();
anzeigen (liste);
loeschen (liste);
anzeigen (liste);
break;
}
}
while (c!='4');
}
element *erstellen (element* ptr)
{
printf ("Wort eingeben ('ENDE' fuer Ende der Liste): ");
scanf("%s", ptr->wort); //Wort einlesen
if (strcmp(ptr->wort,"ENDE")==0) ptr->next=NULL;
else
{
ptr->next = (element*) malloc(sizeof(element));
erstellen (ptr->next);
}
return;
}
void anzeigen (element* ptr)
{
if (liste==NULL)return;
if (ptr->next != NULL)
{
printf ("%s\n",ptr->wort);
anzeigen (ptr->next);
}
return;
}
element *hinzufuegen (element* ptr)
{
struct eintrag* ptrn;
struct eintrag* ptrv;
char d [20];
if (liste==NULL)
{
printf ("Es wurde noch keine Liste angelegt, sie muessen zuerst eine Liste anlegen\n");
return;
}
printf ("Vor welchem Element soll das Wort eingefuegt werden?:");
fflush (stdin);
gets (d);
do
{
if (strcmp(ptr->wort,d)==0)
{
ptrn=ptr;
ptr=(element*)malloc(sizeof(element));
printf ("Wort eingeben: ");
scanf("%s", ptr->wort);
ptr->next=ptrn;
if (ptrn!=liste)ptrv->next=ptr;
if (ptrn==liste)liste=ptr;
return;
}
ptrv=ptr;
ptr=ptr->next;
}
while (ptr->next!=NULL);
printf("Element nicht gefunden\n");
return;
}
element *loeschen (element* ptr)
{
struct eintrag* ptrn;
struct eintrag* ptrv;
char d [20];
if (liste==NULL)
{
printf ("Sie muessen zuerst eine Liste anlegen\n");
return;
}
printf ("Welches Element soll geloescht werden?:");
fflush (stdin);
gets (d);
ptrv=ptr;//ersten Zeiger in pointerv laden
do
{
if (strcmp(ptr->wort,d)==0)
{
ptrn=ptr->next;
if ((ptrv!=liste)||(strcmp(ptrv->wort,d)))ptrv->next=ptrn;
else liste=ptrn;
free (ptr);
ptr=liste;
if (strcmp(ptr->wort,"ENDE")==0)
{
liste=NULL;
free (ptrn);
fflush (stdin);
}
return;
}
ptrv=ptr;
ptr=ptr->next;
}
while (ptr->next!=NULL);
}
Anmerkung: Ich habe das a) unter Linux zusammengehackt und b) jetzt nicht noch mal geteste ob es sich fehlerfrei kompilieren lässt. Außerdem meine ich mich zu erinnern da das ein oder andere Problem mit ungewünschten ausgaben u.ä gehabt zu haben aber na ja
@PornoPenner war bei mir aber auch nicht anderst das ist in der Nacht vor der Abgabe entstanden
__________________
"They who can give up essential liberty to obtain a little temporary safety, deserve neither liberty nor safety"
|
|
|
07.11.10, 21:18
|
#5
|
Anfänger
Registriert seit: Mar 2010
Beiträge: 9
Bedankt: 5
|
@Gosha
das müsste dann so besser sein?
int removeElement() {
struct glied *zeiger = &head;
zeiger->next = head->next;
head->next = head->next->next;
int hilfsvariable = head->next->value;
free(zeiger->next);
return hilfsvariable;
|
|
|
07.11.10, 21:29
|
#6
|
bla
Registriert seit: Mar 2010
Beiträge: 312
Bedankt: 302
|
Habe ich jetzt zwar nicht ausprobiert, sollte aber so funktionieren:
Code:
int removeElement() {
int hilfsvariable;
struct glied *zeiger = head.next;
if (zeiger == NULL)
return -1;
head.next = head.next->next;
hilfsvariable = zeiger->value;
free(zeiger);
return hilfsvariable;
}
void main() {
head.value = -1;
head.next = NULL;
......
Dann schau dir noch den Link an:
[ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]
|
|
|
07.11.10, 21:33
|
#7
|
Anfänger
Registriert seit: Mar 2010
Beiträge: 9
Bedankt: 5
|
@germgerm
kann ich leider noch nicht sagen, da es beim compilen schon hier kracht :
struct glied {
int value;
struct glied *next;
}
struct glied head;
head->value = -1;
head->next = &head;
versteh ich zwar mal garnicht.
lilo.c:6: error: two or more data types in declaration specifiers
lilo.c:7: error: expected â=â, â,â, â;â, âasmâ or â__attribute__â before â->â token
lilo.c:8: error: expected â=â, â,â, â;â, âasmâ or â__attribute__â before âheadâ
krieg ich da oben.
|
|
|
08.11.10, 06:01
|
#8
|
bla
Registriert seit: Mar 2010
Beiträge: 312
Bedankt: 302
|
Zitat:
Zitat von indoh
struct glied {
int value;
struct glied *next;
};
|
Struct muss immer mit Strichpunkt abgeschlossen sein.
Zitat:
Zitat von indoh
struct glied head;
//head->value = -1;
//head->next = &head;
|
Das hat hier nichts zu suchen, schau mal bei meinem main.
|
|
|
Forumregeln
|
Du kannst keine neue Themen eröffnen
Du kannst keine Antworten verfassen
Du kannst keine Anhänge posten
Du kannst nicht deine Beiträge editieren
HTML-Code ist Aus.
|
|
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:40 Uhr.
().
|