doppelter durchlauf bei verk. liste



  • hallo,

    folgende schleife(soll das vorhandensein von wortsynonymen aus einer liste suchen) steigt immer aus, nachdem die liste in der inneren schleife das erste mal durchlaufen wurde. so als ob das aktuell = aktuell->next in der vorletzten zeile garnicht beachtet wird. kann mir jemand sagen woran das liegt?

    gru,

    bastian

    int checksyn(Relations *head)
    {
    char rel = 'S';
    Relations *aktuell = head;
    Relations *aktuell2 = head;

    while (aktuell != NULL)
    {
    if(aktuell->relType == rel)
    {
    while (aktuell2 != NULL)
    {
    if(aktuell2->relType == rel && aktuell2->word == aktuell->dest && aktuell->word == aktuell2->dest)

    printf("match found for: %c %s %s\n",aktuell->relType, aktuell->word, aktuell->dest);
    else
    printf("no match found for: %c %s %s\n", aktuell->relType, aktuell->word, aktuell->dest);
    aktuell2 = aktuell2->next;
    }

    }
    aktuell = aktuell->next;
    }
    return 0;
    }



  • Du solltest nach dem Durchlaufen der inneren Schleife aktuell2 wieder auf den Anfang der Liste setzen, oder besser noch auf aktuell, dann ersparst du dir doppelte Vergleiche.

    P.S.:
    Ich hoffe, word und dest sind keine char-Zeiger.



  • ich hab aktuell2 nach derschleife auf aktuell gesetzt(auch an mehreren stellen probiert), aber jetzt kommt er garnicht mehr aus der schleife raus.
    was mache ich denn falsch ???
    word und dest sind übrigens char pointer. ist das schlimm?

    int checksyn(Relations *head)
    {
    char rel = 'S';
    Relations *aktuell = head;
    Relations *aktuell2 = head;

    while (aktuell != NULL)
    {
    if(aktuell->relType == rel)
    {
    while (aktuell2 != NULL)
    {
    if(aktuell2->relType == rel && aktuell2->word == aktuell->dest && aktuell->word == aktuell2->dest)

    printf("match found for: %c %s %s\n",aktuell->relType, aktuell->word, aktuell->dest);
    else
    printf("no match found for: %c %s %s\n", aktuell->relType, aktuell->word, aktuell->dest);

    //Relations *aktuell2 = head;
    }
    aktuell2 = aktuell;
    }

    aktuell = aktuell->next;
    }
    return 0;



  • Wie sieht denn die Struktur "Relations" aus?



  • der struct sieht so aus:

    typedef struct relations {
    char relType;
    char *word;
    char *dest;
    struct relations *next;
    }Relations;

    das problem mit dem vergleich hab ich jetzt im griff. nur wird in der inneren schleife, falls ein match gefunden wird trotzdem noch vorher ein nicht match ausgegeben. zb so:

    Darwin:~/Desktop bastianbolender$ ./1
    Auto
    Fahrzeug
    Maschine
    Boot
    Nachen
    Kraftfahrzeug
    Blechkiste
    Gegenstand
    H Fahrzeug Auto
    H Fahrzeug Boot
    S Auto Kraftfahrzeug
    S Auto Blechkiste
    S Boot Nachen
    S Nachen Boot
    H Maschine Auto
    Y Auto Fahrzeug
    Y Boot Fahrzeug
    Y Fahrzeug Gegenstand
    no match found for: S Auto Kraftfahrzeug
    no match found for: S Auto Blechkiste
    no match found for: S Boot Nachen
    match found for: S Nachen Boot
    Darwin:~/Desktop bastianbolender$

    fällt noch jemandem ein, wie ich dieses problem lösen könnte? also so dass bei einem match nicht vorher noch "no match" ausgegeben wird?

    die funktion sieht momentan so aus:

    int checksyn(Relations *head)
    {
    char rel = 'S';
    Relations *aktuell = head;
    Relations *aktuell2 = head;

    while (aktuell != NULL)
    {
    if(aktuell->relType == rel)
    {
    while (aktuell2 != NULL)
    {
    if(aktuell2->relType == rel && strcmp(aktuell2->word, aktuell->dest) == 0 && strcmp(aktuell->word, aktuell2->dest) == 0)
    {
    printf("match found for: %c %s %s\n",aktuell->relType, aktuell->word, aktuell->dest);
    aktuell2 = NULL;
    }
    else
    printf("no match found for: %c %s %s\n", aktuell->relType, aktuell->word, aktuell->dest);
    aktuell2 = NULL;
    }
    aktuell2 = aktuell;
    }

    aktuell = aktuell->next;
    }
    return 0;
    }

    p.S: tut mir leid, aber wie rückt man hier den code ein??? mit tabs und leerzeichen gehts bei mir nicht



  • ein weiteres problem dass ich gerade entdeckt hab ist folgendes:

    er findet nur synonyme die direkt hintereinander in der liste stehen. aber wenn ich dass aktuell2 = NULL; unter dem else wegmache rennt er in eine endlos schleife. hat jemand bezüglich dessen eine idee?



  • int checksyn(Relations *head)
    {
    char rel = 'S';
    Relations *aktuell = head;
    Relations *aktuell2 = head;
    
    while (aktuell != NULL)
    {
      if(aktuell->relType == rel)
      {
        while (aktuell2 != NULL)
          {
            if(aktuell2->relType == rel && 
               strcmp(aktuell2->word, aktuell->dest)== 0 && 
               strcmp(aktuell->word, aktuell2->dest) == 0)
               {
                 printf("match found for: %c %s %s\n",
                 aktuell->relType, aktuell->word, aktuell->dest);
                 aktuell2 = NULL;
               }
               else
                 printf("no match found for: %c %s %s\n", aktuell->relType,
                 aktuell->word, aktuell->dest);
               aktuell2 = NULL;
           }
           aktuell2 = aktuell;
        }
        aktuell = aktuell->next;
      }
    return 0;
    }
    

    Du meist so? 😃



  • jo, mit dem einrücken schon. wie macht man das denn? aber das ist eher unwichtig, mir gehts mehr darum, dass der code richtig funktioniert. hast du da eine idee? 😋



  • Beschreibe bitte mal die gewünschte Funktionsweise deines Programms.
    Eingaben -> Verarbeitungsschritte -> Ausgabe

    PS
    FORMATIERE BITTE DEINE TEXTE!!! 😮



  • dir ist das vielleicht unwichtig. mir ist das lesen von unformattiertem code aber zu mühsam.
    es ist ganz einfach. den code ins eingabefeld pasten. den code anwählen und den button "Code" drücken.
    K.



  • wenn ein synonym in der oben stehenden struct bzw. listen struktur steht (großbuchstabe S), soll die funktion überprüfen ob es auch das synonym in umgekehrter form in der liste gibt. also zb boot nachen, nachen boot und es ausgeben. falls es keine umgekehrte form gibt(zb bei auto kraftfahrzeug) soll es eine warnung ausgeben.

    das problem im moment ist aber, dass es mit den schleifen noch nicht so ganz hinhaut. entweder er findet es nur, wenn beides direkt hintereinander steht oder er läuft in eine endlosschleife



  • ok, danke für den hinweis wie man einrückt, hier jetzt nochmal der eingerückte code

    int checksyn(Relations *head)
    {
    	char rel = 'S';
    	Relations *aktuell = head;
    	Relations *aktuell2 = head;
    
    	while (aktuell != NULL)
    	{
    		if(aktuell->relType == rel)
    		{	
    			while (aktuell2 != NULL)
    			{
    			if(aktuell2->relType == rel && strcmp(aktuell2->word, aktuell->dest) == 0  && strcmp(aktuell->word, aktuell2->dest) == 0)
    				{
    				printf("match found for: %c %s %s\n",aktuell->relType, aktuell->word, aktuell->dest);
    				aktuell2 = NULL;
    				}
    			else
    				printf("no match found for: %c %s %s\n", aktuell->relType, aktuell->word, aktuell->dest);
    				aktuell2 = aktuell2->next;
    			}
    
    		}
    		aktuell2 = aktuell;
    		aktuell = aktuell->next;
    
    	}
    	return 0;
    


  • [cpp]
    int checksyn(Relations *head)
    {
    char rel = 'S';
    Relations *aktuell = head;
    Relations *aktuell2 = head;

    while (aktuell != NULL)
    {
    if(aktuell->relType == rel)
    {
    while (aktuell2 != NULL)
    {
    if(aktuell2->relType == rel &&
    strcmp(aktuell2->word, aktuell->dest)== 0 &&
    strcmp(aktuell->word, aktuell2->dest) == 0)

    {
    printf("match found for: %c %s %s\n",
    aktuell->relType, aktuell->word, aktuell->dest);
    aktuell2 = NULL;
    }
    else
    printf("no match found for: %c %s %s\n", aktuell->relType,
    aktuell->word, aktuell->dest);
    aktuell2 = NULL;
    }
    aktuell2 = aktuell;
    }
    aktuell = aktuell->next;
    }
    return 0;
    }
    [/cpp]

    In der IF-Anweisung steckt der Teufel drin - wenn Du mich fragst. Ist aber erstmal nur so ein Gefühl; check das nochmal. 🙂



  • ich glaub eher dass es damit zusammenhängt, wie die pointer sitzen. insbesondere aktuell2. wenn ihr wollt kann ich euch auch das ganze programm schicken, dann könnt ihrs laufen lassen und die funktion selbst testen. sagt mir einfach eure email adressen, falls ihrs haben wollt



  • aktuell2 = NULL;                //Was soll das?
               }
               else
                 printf("no match found for: %c %s %s\n", aktuell->relType,
                 aktuell->word, aktuell->dest);
               aktuell2 = NULL;                 //Was soll das?
           }
           aktuell2 = aktuell;                  //...und das?
        }
        aktuell = aktuell->next;
      }
    return 0;
    }
    


  • picknicker187 schrieb:

    wenn ihr wollt kann ich euch auch das ganze programm schicken, dann könnt ihrs laufen lassen und die funktion selbst testen. sagt mir einfach eure email adressen, falls ihrs haben wollt

    Mit welchem Compiler arbeitest Du?



  • ich versuche halt (im moment leider mehr durch probieren, weil mir nichts mehr einfällt). die zeiger richtig zu setzten. wenn ein match gefunden wurde muss ja die innere schleife vorbei sein, also ist das denke ich schonmal richtig. und nachdem die innere schleife durchlaufen ist muss aktuell2 ja wieder auf den anfang der liste gebracht werden, für den nächsten durchlauf. dass nach dem falschen match die schleife nicht zu ende sein darf weiss ich ja, aber ich habs mal zum testen hingemacht. ich kann dir aber gerne das programm schicken, damit dus selber laufen lassen kannst. ich glaube dann wird es dir um einiges leichter fallen, das problem zu verstehen



  • gcc 3.3



  • picknicker187 schrieb:

    gcc 3.3

    Ist das nicht Unix bzw. Linux? Ach egal...meine Mail ist w.kappesser@arcor.de



  • jein, ist osx

    mail mit dem code hab ich dir gerade geschickt


Anmelden zum Antworten