myGully.com

myGully.com (https://mygully.com/index.php)
-   Programmierung (https://mygully.com/forumdisplay.php?f=67)
-   -   Verkettete Liste in C (DRINGEND!) (https://mygully.com/showthread.php?t=2157590)

indoh 07.11.10 19:04

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

PornoPenner 07.11.10 20:42

"Dringend" im Betreff = Sonntagabend... morgen früh müssen also wieder die Hausaufgaben abgegeben werden :)

gosha16 07.11.10 20:56

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.

spartan-b292 07.11.10 21:02

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 :D

indoh 07.11.10 21:18

@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;

germgerm 07.11.10 21:29

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 und freigeschaltete Mitglieder sichtbar. Jetzt registrieren...]

indoh 07.11.10 21:33

@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.

germgerm 08.11.10 06:01

Zitat:

Zitat von indoh (Beitrag 21501288)
struct glied {
int value;
struct glied *next;
};

Struct muss immer mit Strichpunkt abgeschlossen sein.

Zitat:

Zitat von indoh (Beitrag 21501288)
struct glied head;
//head->value = -1;
//head->next = &head;

Das hat hier nichts zu suchen, schau mal bei meinem main.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:19 Uhr.

Powered by vBulletin® (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.