Buchstaben aus Liste löschen



  • Hallo!

    Schonmal vielen Dank für die schnellen Antworten!

    Da es sich bei der genannten Aufgabe nur um eine Teilaufgabe handelt, poste ich hier mal den ganzen Code.

    #include <stdio.h>
    #include "charList.h"
    
    int main()
    {
    	char c1 = 'A';
    	char c2 = 'a';
    	int i = 0;
    	charListT liste;
    
    	init(&liste);
    
    	for(;c1 <'G'; c1++) {
    	 appendChar(&liste, c1);
    	}
    
       print_liste(&liste);
        int len = length(&liste);
        printf("Laenge der Liste %d\n\n", len);
    
    	int pos = 0;
    	for(;c2 < 'g';c2++){
          insertChar(&liste, c2, pos);
    	  pos = pos +2;
    	}
    
    	print_liste(&liste);
    	len = length(&liste);
    	printf("Laenge der Liste %d\n\n", len);
    
    	for (i = len-2; i >=0; i= i-2) {
    	   removeAtPosition(&liste, i);
    	}
    
    	 /*removeAtPosition(&liste, 10); */
    
        print_liste(&liste);
        len = length(&liste);
    	printf("Laenge der Liste %d\n\n", len); 
    	clear(&liste);
    	print_liste(&liste);
    
    	return 0;
    }
    

    Hier noch die Header-Datei

    #ifndef CHARLIST_H
    #define CHARLIST_H
    
    struct element{
    	char cont;    	
    	struct element* next;  
    };
    
    struct list{
    	struct element* head;
    };
    
    typedef struct element charElemT;
    typedef struct list charListT;
    
    int removeChar(CharList* clist, char c);
    
    #endif
    

    LG Maximilian





  • noobLolo schrieb:

    ihr habt das nicht zufällig zusammen gemacht?
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-259260-and-postdays-is-0-and-postorder-is-asc-and-start-is-0.html

    Ja, es handelt sich anscheinend um die gleiche Aufgabe. 😮 Jedoch wurde in genanntem Thread leider nicht auf das Problem mit dem Löschen der Buchstaben eingegangen. 😞

    LG Maximilian



  • int findAndRemove(list *n,char c){
    	int count = 0;
    	node *prev = 0;
    	node *x = n->head;
    	while(x){
    		if(x->cont == c){
    			if(prev){
    				prev->next = x->next;
    				free(x);
    				x = prev->next;
    			}else{
    				n->head = x->next;
    				free(x);
    				x = n->head;
    			}
    			count++;
    		}else{
    			last = x;
    			x = x->next;
    		}
    	}
    	return count;
    }
    

    das ist sicher nicht die schönste lösung aber klappen sollte es schon, das problem ist das du um aus einer linked list was zu löschen immer das vorherige element brauchst daher auch "prev" als zwischen speicher... gibt es kein prev, löschen wir das erste element und müssen daher den "head" knoten unserer liste updaten

    lg lolo



  • ups. z18

    prev = x;
    statt
    last = x;
    


  • Hallo!

    Vielen vielen Dank an NoobLolo! Du glaubst gar nicht, wie sehr du mir geholfen hast! 🙂

    Ich hätte jedoch noch zwei kleine Fragen, undzwar:

    1. In dem Code stellt "x" doch den zu löschenden Buchstaben dar, oder irre ich mich da?

    2. Wird der, von den Elementen mit gelöschen Buchstaben belegte, Speicher automatisch freigegeben, sobald dieses gelöscht wird?

    LG Maximilian

    Und nochmals vielen Dank an NoobLolo!



  • Hallo!

    Ich habe hier nochmal den Code von NoobLolo modifiziert, aber beim Compilieren kommen da einige Fehlermeldungen. Wir müssen mit einer Header-Datei arbeiten, falls ihr euch wundern solltet. 😉

    Header-Datei

    #ifndef CHARLIST_H
    #define CHARLIST_H
    
    struct element{
    	char cont;    			//information part
    	struct element* next;  //organization part
    };
    
    struct list{
    	struct element* head;
    };
    
    typedef struct element charElemT;
    typedef struct list charListT;
    
    int removeChar(charList *clist, char c);
    
    #endif
    

    Programm-Code

    #include<stdlib.h>
    #include<stdio.h>
    #include "charList.h"
    
    int removeChar(charList *clist, char c)
    {
        int count = 0;
        node *prev = 0;
        node *x = clist->head;
        while(x)
    	{
            if(x->cont == c)
    		{
                if(prev)
    			{
                    prev->next = x->next;
                    free(x);
                    x = prev->next;
                }
    			else
    			{
                    clist->head = x->next;
                    free(x);
                    x = clist->head;
                }
                count++;
            }
    		else
    		{
                prev = x;
                x = x->next;
            }
        }
        return count;
    } 
    
    int removeAtPosition(charListT* clist, int pos)
    {
    	return 0; 
    }
    

    Könnte vielleicht jemand sagen, wo der/die Fehler begraben ist/sind?

    Vielen vielen Dank

    LG Maximilian



  • die daten typen sollten natürlich schon übereinstimmen,

    z.5/18
    int removeChar(charListT *clist, char c); 
    statt
    int removeChar(charList *clist, char c); 
    
    und in z.8/9
    
    charElemT
    statt
    node
    

    post doch mal das komplette teil;)

    lg lolo



  • Also wenn ich die folgende Version compiliere bekomme ich nur noch eine Fehlermeldung. Das sieht schon mal um Welten besser aus! 😉
    Ich denke mal das leigt daran, dass noch keine main()-Funktion definiert wurde, oder liege ich damit falsch? Die Fehlermeldung lautet: "undefined reference to 'WinMain@16' " . Hier nochmal der compilierte Code

    Header

    #ifndef CHARLIST_H
    #define CHARLIST_H
    
    struct element{
    	char cont;    			//information part
    	struct element* next;  //organization part
    };
    
    struct list{
    	struct element* head;
    };
    
    typedef struct element charElemT;
    typedef struct list charListT;
    
    int removeChar(charListT *clist, char c); 
    
    void clear(charListT *clist);
    
    #endif
    

    Programm-Code

    #include<stdlib.h>
    #include<stdio.h>
    #include "charList.h"
    
    int removeChar(charListT *clist, char c)
    {
        int count = 0;
        charElemT  *prev = 0;
        charElemT  *x = clist->head;
        while(x)
    	{
            if(x->cont == c)
    		{
                if(prev)
    			{
                    prev->next = x->next;
                    free(x);
                    x = prev->next;
                }
    			else
    			{
                    clist->head = x->next;
                    free(x);
                    x = clist->head;
                }
                count++;
            }
    		else
    		{
                prev = x;
                x = x->next;
            }
        }
        return count;
    } 
    
    int removeAtPosition(charListT* clist, int pos)
    {
    	return 0; 
    }
    

    Wir haben nun noch ein Hauptprogramm gegeben, welches so geändert werden soll, dass die Funktion des o.g. Codes überprüft werden soll.

    Dieses Hauptprogramm sieht folgendermaßen aus:

    #include <stdio.h>
    #include "charList.h"
    
    int main()
    {
    	char c1 = 'A';
    	char c2 = 'a';
    	int i = 0;
    	charListT liste;
    
    	return 0;
    }
    

    Danke für eure Hilfe!

    LG Maximilian



  • Hallo!

    Das von mir oben gepostete Hauptprogramm bringt einen sicherlich nicht sonderlich weiter. Hier habe ich die "komplette" Version.

    #include <stdio.h>
    #include "charList.h"
    
    int main()
    {
    	char c1 = 'A';
    	char c2 = 'a';
    	int i = 0;
    	charListT liste;
    
    	init(&liste);
    
    	for(;c1 <'G'; c1++) {
    	 appendChar(&liste, c1);
    	}
    
       print_liste(&liste);
        int len = length(&liste);
        printf("Laenge der Liste %d\n\n", len);
    
    	int pos = 0;
    	for(;c2 < 'g';c2++){
          insertChar(&liste, c2, pos);
    	  pos = pos +2;
    	}
    
    	print_liste(&liste);
    	len = length(&liste);
    	printf("Laenge der Liste %d\n\n", len);
    
    	for (i = len-2; i >=0; i= i-2) {
    	   removeAtPosition(&liste, i);
    	}
    
    	 /*removeAtPosition(&liste, 10); */
    
        print_liste(&liste);
        len = length(&liste);
    	printf("Laenge der Liste %d\n\n", len); 
    	clear(&liste);
    	print_liste(&liste);
    
    	return 0;
    }
    

    Wie man sieht, sind darin noch andere Funktionen imlementiert, welche ja erstmal die zu löschenden Elemente erzeugt. Ich soll nun dieses Hauptprogramm so ergänzen, dass gezeigt wird, dass die "removeChar"-Funktion wirklich funktioniert. (was für ein Satz!!!) 🕶 Am vorteilhaftesten wäre es doch, wenn ich diesen "Test" bei Zeile 26 beginne, oder?

    Vielen Dank
    MfG Maximilian



  • zweifelst du an meinen nicht vorhandenen fähigkeiten 😉

    lg lolo



  • noobLolo schrieb:

    zweifelst du an meinen nicht vorhandenen fähigkeiten 😉

    lg lolo

    Natürlich zweifel ich nicht an deinen Fähigkeiten. Ich danke dir sogar vielmals dafür! 🙂

    Wir müssen jedoch diesen Test machen 🙄

    MfG Maximilian



  • Hallo!

    Sorry, dass ich den Thread nach oben pusche, aber langsam wirds zeitmäßig etwas eng bei mir. 😞

    Es wäre also extrem nett, wenn evtl. jemand eine Antwort auf meine Frage(n) hätte!

    Dankeschön
    MfG Maximilian



  • Max789 schrieb:

    Hallo!
    Sorry, dass ich den Thread nach oben pusche, aber langsam wirds zeitmäßig etwas eng bei mir. 😞

    Ach, so ist das.
    Es ist nicht unüblich, Geld zu bieten für Praktikumsaufgaben. Das gleicht ein wenig die Undurchlässigkeit der Bildungsschichten aus. Jemand, der nicht so das Händchen dafür hat, zahlt 80€ oder je nach dem für eine Lösung und ein junger aufstrebender Informatikstudent mit Händchen dafür aus ärmeren Kreisen kann sich davon 50+ Tiefkühlpizzen kaufen.


Anmelden zum Antworten