Doppel verkettete Liste - Suche realisieren

Dieses Thema im Forum "C/C++" wurde erstellt von profun, 16.06.2012.

  1. profun

    profun Grünschnabel

    Dabei seit:
    28.04.2007
    Beiträge:
    4
    Zustimmungen:
    0
    Hallo Liebe C-Coders! Ich habe vielleicht Grundkenntnisslücken oder Missverständnisse mit der dynamischen Daten-Strukturen in C. Ich habe die folgende Aufgabe:

    "Die folgende Vereinbarung beschreibt das Knotenelement einer doppeltverketteten linearen Liste zur
    Behandlung von Messdaten. Die Komponente "Messwert" repräsentiert den ganzzahligen Messwert,
    die Komponente "Anz" gibt an, wie häufig dieser aufgetreten ist.
    struct elem_t
    {
    int Messwert;
    int Anz;
    struct elem *next;
    struct elem *prev;
    };

    Zu Realisieren ist eine Funktion, mit der man untersucht, ob ein Knotenelement mit gleichem Messwert existiert, die Anzahl erhöht und den Zeiger auf diesen Knoten zurückliefert.
    Übergabeparameter sind der Messwert und der Zeiger auf das erste Listenelement (Wurzel). Der Prototyp der Funktion lautet:
    struct elem *LstSuchInc(struct elem *wrz, int ulWert);"


    So meine Frage: Wie sucht man in der doppel verkettete Liste nach schon existierten Element und wie beschreibt man wie häufig dieses Element aufgetreten ist?
    Hier ist meine doppel verkettete liste mit einfachen ein/ausgaben funktionen: http://pastebin.com/adexbkcq

    Bitte um Hilfsschritte!
    Grüße,
    profun
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 Arch, 17.06.2012
    Zuletzt bearbeitet: 17.06.2012
    Arch

    Arch Foren As

    Dabei seit:
    21.10.2011
    Beiträge:
    81
    Zustimmungen:
    0
    Du hast doch schon diesen Part in deinem Program so wie ich das sehen:
    Code:
    while(ptr != NULL){
            printf("MESSWERT %d\n", ptr->Messwert);
            ptr=ptr->next;
    }
    
    Anstatt den Messwert auszugeben prüfst du einfach ob der Messwert dem zu suchendem Wert entspricht. Falls ja erhöhst du die Anzahl (Anz) um eins und weist dem Zeiger die Adresse des übereinstimmenden Elements zu (so habe ich es zumindest verstanden).

    //EDIT: Ach ne, du gibst das gefundene Element einfach zurück.... das ist ja die Wurzel die übergeben wird :D .
    Mein C ist schon ein wenig eingerostet, falls ich Fehler habe könnt ihr mich gerne korrigieren:
    Code:
    struct elem *LstSuchInc(struct elem *wrz, int ulWert){
    	struct elem *currentElement = wrz;
    	while (currentElement != NULL) {
    		if (currentElement->Messwert == ulWert) {
    			currentElement->Anz += 1;
    			return currentElement;
    		}
    		currentElement = currentElement->next;
    	}
    }
    
    So habe ich das verstanden. Dabei wird die Liste nur vorwärts durchlaufen, wenn die Wurzel aber auch das letzte Element sein kann, muss der Code noch ein wenig angepasst werden :) .
     
  4. profun

    profun Grünschnabel

    Dabei seit:
    28.04.2007
    Beiträge:
    4
    Zustimmungen:
    0
    Danke für ihre Antwort, Arch! Das geht genau richtig, wenn auch currentElemet = root. :) Schade aber, gibt es noch ein Problem:
    Na habe ich eine Funktion für hinzufügen eines Elements am Ende der Liste. Na aber, funktioniert sie nicht, und warum, weiss ich nicht....
    Hier ist die Funktion: http://pastebin.com/cf85xNYT
    Und wie muss das in main() implementiert werden, um richtig zu laufen?Ideen?
     
  5. Arch

    Arch Foren As

    Dabei seit:
    21.10.2011
    Beiträge:
    81
    Zustimmungen:
    0
    Gleich angewöhnen, else wird in den meisten Fällen nicht benötigt und sollte dann weggelassen werden :)
    Du übergibst der Funktion doch das neue Element und das letzte Element in der Liste, deshalb ist das ja relativ einfach. Vielleicht solltest du dich grundlegen nochmal mit einer Programmiersprache beschäftigen um dich besser in solche Probleme reindenken zu können. Ich will dir ja hier nicht deine ganzen Aufgaben vorprogrammieren :)
    Code:
    void LstInsert(struct elem *neu, struct elem *last){
        neu->next = NULL;
        neu->prev = last;
        last->next = neu;
    }
    
     
  6. ixs

    ixs Foren As

    Dabei seit:
    20.06.2008
    Beiträge:
    95
    Zustimmungen:
    0
    Ehrlich gestanden schreibe ich den Post ohne ihn erst völlig durchgedacht zu haben. Doch es gibt noch die Möglichkeiten mit Arrays und Vectoren an das Problem herran zu gehen. Vom Sinn her ändert sich aber an Arch's Lösung überhaupt nichts.
     
  7. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  8. profun

    profun Grünschnabel

    Dabei seit:
    28.04.2007
    Beiträge:
    4
    Zustimmungen:
    0

    Wenn ich richtig verstanden habe, soll etwas solches existieren:

    Code:
    ....
    	ptr=root;
    	while(ptr!=NULL){
    		ptr=ptr->next;
    		}
    		if(ptr->next==NULL){
    			last=ptr;
    			neu=malloc(sizeof(struct elem));
    			neu=last->next;
    			neu->prev=last;
    			last->next=neu;
    			neu->next=NULL;
    			}
    ...
    
     
  9. Arch

    Arch Foren As

    Dabei seit:
    21.10.2011
    Beiträge:
    81
    Zustimmungen:
    0
    Ok

    Code:
    neu=malloc(sizeof(struct elem));
    neu=last->next;
    
    Auf welchen Nachfolger zeigt bei einer Liste das letzte Element? Und warum setzt du den Zeiger zwei mal hintereinander? Was soll das malloc hier deiner Meinung nach tun, also welche Adresse soll da geliefert werden?

    Oben schreibst du noch du verwendest diesen Methodenkopf:
    Code:
    void LstInsert(struct elem *neu, struct elem *last)
    
    Warum nimmst du dann um das letzte Element zu suchen eine Schleife? Das wurde doch der Funktion übergeben?
     
Thema:

Doppel verkettete Liste - Suche realisieren

Die Seite wird geladen...

Doppel verkettete Liste - Suche realisieren - Ähnliche Themen

  1. Suche in Datei doppelte Wörter in jeder Zeile bis zum dritten Leerzeichen...

    Suche in Datei doppelte Wörter in jeder Zeile bis zum dritten Leerzeichen...: Ich habe eine Textdatei in der ich Einträge bis zum 3. Leerzeichen mit den restlichen Zeilen (auch nur bis 3. Leerzeichen) vergleichen muss und...
  2. doppel würfel / double transposition programm

    doppel würfel / double transposition programm: Hallo Zusammen, ich bin gerade auf der Suche nach einem Programm das mir hilft einen Plain Text mit der Doppelwürfel oder Double Transposition...
  3. CyanogenMod im Doppelpack

    CyanogenMod im Doppelpack: Nachdem sich der führende CyanogenMod-Entwickler Steve Kondik im September selbstständig gemacht hat, kündigte er grundlegende Änderungen im...
  4. Shell Skript zum automatischen Aufräumen von doppelten Ordnern

    Shell Skript zum automatischen Aufräumen von doppelten Ordnern: Hallo, Ich möchte mir ein Shell Script für folgenden Zweck schreiben. Meine Mutter hat auf Ihrem PC und auf verschiedenen Festplatten viele...
  5. feld doppelt benutzen

    feld doppelt benutzen: guten morgen ich möchte ein feld doppelt verwenden. also jetzt ist die ausgabe 1,2,3 und die soll sein 1,2,3,1 mit cut -d',' -f1,2,3,1...