Einfach verkettete Listen



  • Hallo,

    ich bin mal neu hier und hoffe einmal auf eine gute zusammenarbeit. Wir machen derzeit einfach verkettete Listen (in der schule) ich bin ned auf der uni. Da wollte ich fragen ob ihr mal vl so nett wäret mein c Programm durchforsten zu können, was da so falsch ist. Ich erstelle mal die Liste das funktioniert auch mal. Aber wenn ich ein Wort in der Liste löschen will das größer ist als mein suchendes dann gibt es mir gar nichts mehr aus.

    //stefan
    //01.10.2007
    //mein zweiter Versuch mit C in diesem Jahr
    /*Zu verwenden ist wieder unsere Datei Worte.txt
    Eingegeben wird ein Wort und ausgegeben sollen alle
    Worte werden, die aus der Buchstabenmenge des
    Eingabewortes gebildet werden können. Zwischen
    Groß- und Kleinbuchstaben wird nicht unterschieden.*/
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    #include <malloc.h>
    #include <string.h>
    
    typedef struct wort                                  //Listenelement für eine verk. Liste
    {
      int nummer;
      char inhalt[50];
      struct wort *next;
    } knoten;                                            // kürzere Schreibweise für dieses struct
    
    FILE *fp;
    void fileoeffnen();
    void einlesen();
    knoten* knotenanlegen(int,char []);
    knoten* loeschen();
    void fileclose();
    void ausgabe(knoten*);
    void vergleich();
    
    //Globale Variablen
    knoten *head=NULL;
    knoten *hlp;
    
    int main(int argc, char *argv[])
    {
        fileoeffnen();
        einlesen();
        fileclose();
        printf("\n");
        system("Pause");
    
    }
    
    void fileoeffnen()
    {
     fp=fopen("worte.txt","r");
        if(!fp)
        {
           printf("Datei nicht o.k.\n");
           system("Pause");                                 // auch getch() möglich
           exit(1);
        }
    }
    
    void einlesen()
    {
         char puffer[50]; //puffer zum einlesen der Liste und suchen für das suchenede Wort
         int nr=0;  //Nummer für die Wortanzahl
    
         while (!feof(fp)) //Solange das ende vom File
         {
                fgets(puffer,50,fp); //Das Wort einlesen in puffer
                hlp=knotenanlegen(nr,puffer); //Übergibt nr und puffer in die Funktion Knotenanlegen und hlp kriegt den wert zurück
                head=hlp;
                //ausgabe(head);
                head->next=NULL;
                nr++;
         }
         vergleich();
    }
    
    void vergleich()
    {
      char suchen[50];
      printf("Geben Sie das Wort ein, was Sie suchen!\nWort: ");
      gets(suchen);
      printf("\n");
      while(head)
      {
        if(strlen(head->inhalt) <= strlen(suchen))
          head=head->next;
        /*else
        {
          head->next;
          free(hlp);
        }*/
        head = head->next;
      ausgabe(head);
      }
    
    }
    
    knoten *knotenanlegen(int nr, char puffer[])
    {
           knoten *hilfsknoten; //Ein Pointer
           hilfsknoten=(knoten*)malloc(sizeof(knoten)); //Speicher vorreservieren
           strcpy(hilfsknoten->inhalt,puffer); //Den Inhalt von Puffer in die Liste speichern
           hilfsknoten->nummer=nr; //Den Inhalt von nr in die Liste speichern
           hilfsknoten->next=NULL; //Next auf Null setzen
           return hilfsknoten; //Next zurück liefern
    }
    
    void fileclose()
    {
        fclose(fp);
    }
    
    void ausgabe(knoten* head)
    {
       while(head)
       {
         printf("%d. %s",head->nummer,head->inhalt);
         head=head->next;
       }
    }
    


  • c Programm

    Wir sind hier im C++-Unterforum ...

    typedef struct word
    {
    	unsigned int id;
    	char content[50];
    	struct word* next;
    } node;
    
    bool read_contet(FILE* file_ptr);
    node* create_node(unsigned int id, char* data);
    node* search_node(const char* data);
    node* search_node(unsigned int id);
    
    node* g_first = NULL;
    
    int main(int argc, char *argv[])
    {
    	FILE* file_ptr = fopen("words.txt", "r");
    	if (file_ptr == NULL) { printf("FEHLER: Datei \"words.txt\" konnte nicht gefunden werden!"); return 1; }
    	if (read_content(file_ptr) == false) { printf("FEHLER: Datei \"words.txt\" beschädigt!"); return 2; }
        fclose(file_ptr);
        printf("Daten eingelesen!");
    	for (node* item = g_first; item != NULL; item = item->next)
    		printf("ID: %d Data: \"%s\"", item->id, item->content);
    	printf("\"Affe\" suchen ...");
    	node* search = search_node("Affe");
    	if (search == NULL) printf("\"Affe\" nicht gefunden!");
    	else printf("\"Affe\" steht an Stelle %d", search->id + 1);
    	system("pause");
    }
    
    bool read_content(FILE* file_ptr)
    {
    	char buf[50];
    	for (unsigned int i = 0; !feof(file_ptr); ++i)
    	{
    		fgets(buf, 50, file_ptr);
    		create_node(i, buf);
    	}
    }
    
    node* create_node(unsigned int id, char* data)
    {
    	node* result = (node*) malloc(sizeof(node));
    	if (result == NULL) return NULL;
    	strncpy(result->content, data, 50);
    	result->id = id;
    	result->next = NULL;
    	node* cur = g_first;
    	while (cur) cur = cur->next;
    	cur = result;
    	return result;
    }
    
    node* search_node(const char* data)
    {
    	node* tmp = g_first;
    	while (tmp) { if (strcmp(tmp->content, data) == 0) return tmp; tmp = tmp->next; }
    	return NULL;
    }
    
    node* search_node(unsigned int id)
    {
    	node* tmp = g_first;
    	while (tmp) { if (tmp->id == id) return tmp; tmp = tmp->next; }
    	return NULL;
    }
    

    ... so dein Programm einmal aufgeräumt ... du musst jetzt nurnoch deinen Speicher wieder freigeben!



  • ich hab gedacht das ist C/C++ sry gibt es kein c unterforum? und das ist nun aufgeräumt in form von C? danke dir einmal das du dir mein problem angenommen hast. ich schaus mir mal an was du den da alles verändert hast, sieh ich ned so schnell.

    mfg Hofnarr

    //edit wenn ichs starten will unter dev cpp funkt es nicht?



  • hofnarr schrieb:

    ich hab gedacht das ist C/C++ sry gibt es kein c unterforum?

    Klar gibt es das - das Board nennt sich "Ansi C".

    (und dort landet dein Thread jetzt auch)



  • Dieser Thread wurde von Moderator/in CStoll aus dem Forum C++ in das Forum ANSI C verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Log in to reply