telefonbuch



  • hej 🙂

    und zwar folgendes problem ..

    muss für mein studium ein c programm schreiben .. das wie ein elektronisches telefonbuch aufgebaut ist ..

    hab es auch soweit fertig .. aber eine funktion lässt sich noch nicht so ganz programmieren ..

    ich soll namen, die ich im telefonbuch eingegeben habe .. auch wieder ändern ..
    z.b. bei adressverzug ..

    dies funktioniert soweit auch .. wenn ich nur eine person im telefonbuch stehen habe .. habe ich aber 2 oder mehrere ... ändert es mir immer nur die oberste person , die im telefonbuch angezeigt wird .. und nicht die person , die eigentlich geändert werden sollte ..

    wie kann ich das ändern ?

    hier das programm dazu :

    /*
    Name: telefon
    Copyright:
    Author: boehm
    Date: 26.04.06 15:10
    Description: einfach verkettete Liste aus Datensaetzen (Strukturen)
    dynamische Speicheranforderung!
    */

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>

    /--------------------------Datentypen-----------------------------------/
    struct telem {
    char fn[15]; /*Fam.-name*/
    char vn[15]; /*Vorname*/
    char tel[20]; /*Tel-Nr.*/
    struct telem * next; /*Zeiger auf eine Struktur vom Typ struct telem*/

    }; /*Definition eines eigenen Namens fuer diesen Strukturtyp*/

    /*alternativ koennte auch mit einem eigenen Datentyp "eintrag" gearbeitet werden:
    typedef struct telem
    {char fn[15];
    char vn [15],
    char tel[20];
    struct telem * next;
    } eintrag;
    */

    /---------------------------Funktionsprototypen-------------------------------/
    void satz_eingeben (struct telem * pe);
    void satz_anzeigen (struct telem * pe);
    struct telem * suchen (char * name);
    int aendern (char * aname);
    int loeschen (char * suchname);
    struct telem * vorgaenger;

    struct telem * start_ptr=NULL; /*Zeiger auf ersten Eintrag der Liste*/

    /---------------------------Hauptprogramm-------------------------------------/
    int main (void)
    {

    struct telem * zh=NULL, *vorgaenger=NULL; /*Hilfs-Zeiger*/
    struct telem * ptr=NULL;
    struct messdaten * meineListe = NULL;

    char suchname[15]; /*Puffer-Variable fuer einen Namen*/
    char aname[15];
    int gefunden = 0; /*Zahl der Treffer bei der Suche*/
    int wahl; /*Variable für Menue-Auswahl*/
    char name[30];
    char vorname[30];
    unsigned int groesse=sizeof(struct telem); /*Groesse eines Eintrags in der Liste*/

    do
    {
    system ("cls"); // in Unix-Systemen: system ("clear");
    printf ("\nTelefonverzeichnis als dynam. Liste\nBitte Auswahl treffen");
    printf ("\n\nneuer Eintrag ins Tel.-buch 1");
    printf ("\nAnzeige aller Eintraege ... 2");
    printf ("\nEintrag suchen + anzeigen . 3");
    printf ("\nEintrag aendern ........... 4");
    printf ("\nEintrag loeschen .......... 5");
    printf ("\nEnde ...................... 6");
    printf ("\n\nIhre Wahl? ");
    if(scanf("%i", &wahl)!=1)
    {
    while(getchar()!=10);continue;
    }

    switch (wahl) /*Menue-Auswahl bearbeiten*/
    {
    case 1: /*neuen Eintrag als erstes Element ins Telbuch einfuegen*/
    system ("cls"); // in Unix-Systemen: system ("clear");
    if ((zh=(struct telem ) malloc(groesse))==NULL)
    {/*falls nicht genug Speicher erhaeltlich*/
    printf("Speichermangel, kein neuer Eintrag moeglich!");
    break;
    }
    printf ("\nEingabe eines neuen Eintrags fuer das Telefonbuch\n");
    satz_eingeben(zh); /*Neuer Satz, zh als Zeiger darauf*/
    zh->next = start_ptr; /*neues Element an den Anfang ... */
    start_ptr = zh; /
    ... der Liste einfuegen*/
    printf ("\nDieser Eintrag wurde neu aufgenommen");
    satz_anzeigen(start_ptr); /*Kontrolle*/
    printf("\n\n"); system("pause");break;

    case 2:
    system ("cls"); // in Unix-Systemen: system ("clear");
    printf("\nAnzeige aller gespeicherten Telefonbuch-Eintraege");
    printf("\n Familienname Vorname Tel.-Nr.");
    zh=start_ptr; /*zh auf ersten Eintrag stellen*/
    while (zh!=NULL) /*solange noch ein voller Eintrag...*/
    {
    satz_anzeigen (zh); /*aktuellen Eintrag anzeigen*/
    zh=zh->next; /*zh weiterschalten*/
    }
    printf("\n\n"); system("pause");break;

    case 3: /*Einen Eintrag suchen und anzeigen*/
    system ("cls"); // in Unix-Systemen: system ("clear");
    printf ("\n\nNach welchem Vornamen wollen Sie suchen ? ");
    scanf ("%s", name);

    if ((ptr=(struct telem *)suchen(name)) == NULL)
    printf ("\n Der Name %s ist nicht vorhanden", name);
    else
    printf ("\n Familienname: %s,Vorname: %s,Telefonnummer: %d",
    ptr->fn, ptr->vn, ptr->tel);
    printf("\n\n"); system("pause");
    break;

    case 4: /*einen Eintrag suchen und aendern*/
    system ("cls"); // in Unix-Systemen: system ("clear");
    printf ("\n\nWelchen Familiennamen wollen Sie aendern ? ");
    scanf ("%14s", aname);

    if (aendern (aname) )
    {
    printf ("\nFehler beim aendern eines Listenelements");
    printf("\n\n\n");
    system("pause");

    }
    system ("pause");
    break;

    case 5: /*einen Eintrag suchen und loeschen*/
    printf ("\n\nWelchen Familiennamen wollen Sie loeschen ? ");
    scanf ("%14s", suchname);

    if (loeschen (suchname) )
    {
    printf ("\nFehler beim Loeschen eines Listenelements");
    printf("\n\n\n");
    system("pause");

    }

    break;
    case 6: ptr=start_ptr; // Datensätze werden aus dem Heap gelöscht
    while ( start_ptr != NULL )
    {
    // satz_anzeigen(ptr);
    start_ptr=ptr->next;
    free(ptr);
    ptr=start_ptr;

    }
    break;
    default: continue; /*sonst nochmal*/
    }
    }while (wahl != 6); /*wdhl. solange Auswahl != Ende*/
    //system("pause");
    return 0;
    }

    /-------------------------------Funktionen-------------------------------/

    /*Funktion zur Abfrage/Eingabe von Komponenten eines Datensatzes*/
    /*Ein- und Ausgabeparameter: Zeiger auf einen Datensatz(eintrag)*/

    void satz_eingeben (struct telem * pe)
    { printf ("\nFamilienname? "); /*komponentenweise Abfrage des Datensatzes*/
    scanf("%s",pe->fn);
    printf ("Vorname? ");
    scanf("%s",pe->vn);
    printf ("Tel-Nr.? ");
    scanf("%s", pe->tel);
    };

    /*Funktion zum Anzeigen der Komponenten eines Datensatzes*/
    /*Eingabeparameter: Zeiger auf anzuzeigenden Datensatz*/
    /*Achtung! Funktion benutzt Zeiger auf den Datensatz (eintrag)*/

    void satz_anzeigen (struct telem * pe)

    { printf ("\n %15s %15s %20s", pe->fn, pe->vn, pe->tel);

    };
    /---------Funktion suchen-----------------/
    struct telem * suchen (char * name)
    {
    struct telem * ptr=NULL;
    ptr = start_ptr;

    while (ptr != NULL && strcmp (ptr->vn, name))
    ptr = ptr->next;

    /* der Pointer auf das gesuchte Element wird zurueckgegeben */
    return ptr;
    };

    /---------Funktion Loeschen --------------/

    int loeschen (char * suchname)
    {
    struct telem * ptr = NULL, * vorgaenger;
    char antwort;
    ptr=start_ptr; // ptr ist start-wert

    while (ptr != NULL) // ist ptr gleich 0 ?
    {

    if (!strcmp (ptr->fn,suchname)) // wenn ptr = vn .. dann
    {
    satz_anzeigen (ptr);
    printf("\nDiesen Teilnehmer loeschen [j/n]? ");
    scanf (" %c",&antwort); fflush(stdin); //eingabepuffer wird gelöscht (geht nur unter windows)
    if (antwort == 'j' )
    {
    if (ptr == start_ptr) // wenn ptr = start-wert
    {
    start_ptr = ptr->next; // wenn start-wert = ptr .. soll er auf next-wert zeigen
    free(ptr); //freigeben des pointers
    ptr =NULL;
    }
    else // ansonsten
    {
    vorgaenger->next = ptr->next; // vorgänger soll auf übernächsten zeigen
    free (ptr); // freigeben des pointers
    ptr =NULL;
    }
    return 0;
    }

    }
    vorgaenger = ptr;
    ptr = ptr->next;

    }
    return 1;
    }

    //======================================

    int aendern (char * aname)
    {
    struct telem * ptr = NULL, * vorgaenger;
    char antwort1;
    ptr=start_ptr; // ptr ist start-wert

    while (ptr != NULL) // ist ptr gleich 0 ?
    {

    if (!strcmp (ptr->fn,aname)) // wenn ptr = fn .. dann
    {
    satz_anzeigen (ptr);
    printf("\nDiesen Teilnehmer aendern [j/n]? ");
    scanf (" %c",&antwort1); fflush(stdin); //eingabepuffer wird gelöscht (geht nur unter windows)
    if (antwort1 == 'j' )
    {
    satz_eingeben (ptr);
    }
    }
    return 0;
    }
    return 1;
    }

    ==============================

    ende

    ============

    würde mich über diverse ratschläge freuen !

    danke !



  • 1. code tags benutzen, ohne Code tags ist das absolut unleserlich...
    2. richiges forum benutzen. dies ist das C# Forum, Du wilst aber ein C Programm schreiben...

    (wird auf heutigen Schulen eigendlich nciht mehr lesen gelehrt?)



  • Dieser Thread wurde von Moderator/in CMatt aus dem Forum C# und .NET 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.



  • sobald du die flags benutzt werde ich dir helfen -.-



  • atticus1985 schrieb:

    /*
      Name: telefon
      Copyright: 
      Author: boehm
      Date: 26.04.06 15:10
      Description:  einfach verkettete Liste aus Datensaetzen (Strukturen) 
                    dynamische Speicheranforderung!
    */
    
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    /*--------------------------Datentypen-----------------------------------*/
    struct telem {
           char fn[15];				/*Fam.-name*/
           char vn[15];				/*Vorname*/
           char tel[20];			/*Tel-Nr.*/
           struct telem * next;		/*Zeiger auf eine Struktur vom Typ struct telem*/
           
           };            /*Definition eines eigenen Namens fuer diesen Strukturtyp*/
    
    /*alternativ koennte auch mit einem eigenen Datentyp "eintrag" gearbeitet werden:
    typedef struct telem
    	{char fn[15];
    	 char vn [15],
    	 char tel[20];
    	 struct telem * next;
    	} eintrag;
    */
    
    /*---------------------------Funktionsprototypen-------------------------------*/
    void satz_eingeben (struct telem * pe);
    void satz_anzeigen (struct telem  * pe);
    struct telem * suchen (char * name);
    int aendern (char * aname);
    int loeschen (char * suchname);
    struct telem * vorgaenger;
    
    struct telem * start_ptr=NULL;       /*Zeiger auf ersten Eintrag der Liste*/
    
    /*---------------------------Hauptprogramm-------------------------------------*/
    int main (void)
    {
    
    struct telem * zh=NULL, *vorgaenger=NULL;      /*Hilfs-Zeiger*/
    struct telem * ptr=NULL;
    struct messdaten * meineListe = NULL;
    
    char suchname[15];                   /*Puffer-Variable fuer einen Namen*/
    char aname[15];
    int gefunden = 0;					 /*Zahl der Treffer bei der Suche*/
    int wahl;							 /*Variable für Menue-Auswahl*/
    char name[30];
    char vorname[30];
    unsigned int groesse=sizeof(struct telem);  /*Groesse eines Eintrags in der Liste*/
    
      do
      {
        system ("cls");  // in Unix-Systemen: system ("clear");
        printf ("\nTelefonverzeichnis als dynam. Liste\nBitte Auswahl treffen");
        printf ("\n\nneuer Eintrag ins Tel.-buch 1");
        printf ("\nAnzeige aller Eintraege ... 2");
        printf ("\nEintrag suchen + anzeigen . 3");
        printf ("\nEintrag aendern ........... 4");
        printf ("\nEintrag loeschen .......... 5");
        printf ("\nEnde ...................... 6");
        printf ("\n\nIhre Wahl?   ");
        if(scanf("%i", &wahl)!=1)
    		{
    			while(getchar()!=10);continue;
    		}
    
        switch (wahl)                            /*Menue-Auswahl bearbeiten*/
        {
          case 1:  /*neuen Eintrag als erstes Element ins Telbuch einfuegen*/
               system ("cls");  // in Unix-Systemen: system ("clear");
    	       if ((zh=(struct telem *) malloc(groesse))==NULL)
    		   {/*falls nicht genug Speicher erhaeltlich*/
    		    printf("Speichermangel, kein neuer Eintrag moeglich!");
    		    break;
    		   }
    	       printf ("\nEingabe eines neuen Eintrags fuer das Telefonbuch\n");
    	       satz_eingeben(zh);       /*Neuer Satz, zh als Zeiger darauf*/
    	       zh->next  = start_ptr;      /*neues Element an den Anfang ... */
    	       start_ptr = zh;            /*... der Liste einfuegen*/
    	       printf ("\nDieser Eintrag wurde neu aufgenommen");
    	       satz_anzeigen(start_ptr);        /*Kontrolle*/
               printf("\n\n"); system("pause");break;
    
          case 2:  
               system ("cls");  // in Unix-Systemen: system ("clear");
               printf("\nAnzeige aller gespeicherten Telefonbuch-Eintraege");
    	       printf("\n       Familienname         Vorname        Tel.-Nr.");
    	       zh=start_ptr;        /*zh auf ersten Eintrag stellen*/
    	       while (zh!=NULL)     /*solange noch ein voller Eintrag...*/
    		   {
    		    satz_anzeigen (zh);    /*aktuellen Eintrag anzeigen*/
    		    zh=zh->next;           /*zh weiterschalten*/
    		   }
    	       printf("\n\n"); system("pause");break;
    
          case 3:  /*Einen Eintrag suchen und anzeigen*/
    		   system ("cls");  // in Unix-Systemen: system ("clear");
               printf ("\n\nNach welchem Vornamen wollen Sie suchen ? ");
               scanf ("%s", name);
    
                     if ((ptr=(struct telem *)suchen(name)) == NULL)
                     printf ("\n Der Name %s ist nicht vorhanden", name);
                     else
                       printf ("\n Familienname: %s,Vorname: %s,Telefonnummer: %d",
                          ptr->fn, ptr->vn, ptr->tel);
                          printf("\n\n"); system("pause");
    		   break;
    
          case 4:   /*einen Eintrag suchen und aendern*/
    		   system ("cls");  // in Unix-Systemen: system ("clear");
              printf ("\n\nWelchen Familiennamen wollen Sie aendern ? ");
               scanf ("%14s", aname);
    
       if (aendern (aname) )
       {
          printf ("\nFehler beim aendern eines Listenelements");
          printf("\n\n\n");
          system("pause");
        
       }
               system ("pause");
    		   break;
    
          case 5:   /*einen Eintrag suchen und loeschen*/
    		   printf ("\n\nWelchen Familiennamen wollen Sie loeschen ? ");
               scanf ("%14s", suchname);
    
       if (loeschen (suchname) )
       {
          printf ("\nFehler beim Loeschen eines Listenelements");
          printf("\n\n\n");
          system("pause");
        
       }
               
                      
    		   break;
       case 6: ptr=start_ptr; // Datensätze werden aus dem Heap gelöscht
       while ( start_ptr != NULL )
       {
           // satz_anzeigen(ptr); 
           start_ptr=ptr->next;
           free(ptr);
           ptr=start_ptr;  
           
       }
       break;   
          default: continue;                    /*sonst nochmal*/
        }
      }while (wahl != 6);                   /*wdhl. solange Auswahl != Ende*/
      //system("pause");
      return 0;
    }
    
    /*-------------------------------Funktionen-------------------------------*/
    
    /*Funktion zur Abfrage/Eingabe von Komponenten eines Datensatzes*/
    /*Ein- und Ausgabeparameter: Zeiger auf einen Datensatz(eintrag)*/
    
    void satz_eingeben (struct telem * pe)
    {   printf ("\nFamilienname? ");       /*komponentenweise Abfrage des Datensatzes*/
        scanf("%s",pe->fn);
        printf ("Vorname? ");
        scanf("%s",pe->vn);
        printf ("Tel-Nr.? ");
        scanf("%s", pe->tel);
    };
    
    /*Funktion zum Anzeigen der Komponenten eines Datensatzes*/
    /*Eingabeparameter: Zeiger auf anzuzeigenden Datensatz*/
    /*Achtung! Funktion benutzt Zeiger auf den Datensatz (eintrag)*/
    
    void satz_anzeigen (struct telem * pe)
    
    {   printf ("\n    %15s  %15s  %20s", pe->fn, pe->vn, pe->tel);
    
    };
    /*---------Funktion suchen-----------------*/
    struct telem * suchen (char * name)
    {
       struct telem * ptr=NULL;
       ptr = start_ptr;
       
       while (ptr != NULL && strcmp (ptr->vn, name))
          ptr = ptr->next;
    
       /* der Pointer auf das gesuchte Element wird zurueckgegeben */
       return ptr;
    };
    
    /*---------Funktion Loeschen --------------*/
    
    int loeschen (char * suchname)
    {
       struct telem * ptr = NULL, * vorgaenger;
       char antwort;
       ptr=start_ptr;                            // ptr ist start-wert
       
    
       while (ptr != NULL)                       // ist ptr gleich 0 ?
       {
          
          if (!strcmp (ptr->fn,suchname))          // wenn ptr = vn .. dann
          {  
              satz_anzeigen (ptr);
              printf("\nDiesen Teilnehmer loeschen [j/n]? ");
              scanf  (" %c",&antwort); fflush(stdin); //eingabepuffer wird gelöscht (geht nur unter windows)
              if (antwort == 'j' )
              {
             if (ptr == start_ptr)               // wenn ptr = start-wert
              {
              start_ptr = ptr->next;              // wenn start-wert = ptr .. soll er auf next-wert zeigen
              free(ptr);                          //freigeben des pointers
              ptr =NULL; 
              }        
             else                                // ansonsten 
             { 
             vorgaenger->next = ptr->next;       // vorgänger soll auf übernächsten zeigen
             free (ptr);                         // freigeben des pointers
             ptr =NULL;                        
             }       
             return 0;
             } 
             
          }
              vorgaenger = ptr;
              ptr = ptr->next;
      
      } 
      return 1;
    }
    
    //======================================
    
    int aendern (char * aname)
    {
       struct telem * ptr = NULL, * vorgaenger;
       char antwort1;
       ptr=start_ptr;                            // ptr ist start-wert
       
    
       while (ptr != NULL)                       // ist ptr gleich 0 ?
       {
          
          if (!strcmp (ptr->fn,aname))          // wenn ptr = fn .. dann
          {  
              satz_anzeigen (ptr);
              printf("\nDiesen Teilnehmer aendern [j/n]? ");
              scanf  (" %c",&antwort1); fflush(stdin); //eingabepuffer wird gelöscht (geht nur unter windows)
              if (antwort1 == 'j' )
                          {
                          satz_eingeben (ptr);
                          }
              }
              return 0;
              }
              return 1;
              }
    
    ==============================
    
    ende 
    
    ============
    

    danke !



  • deine änder funktion geht nicht die ganze liste durch sondern bleibt konstant, so nebenbei noch.

    die formatierung ist schrecklich und deine Kommentare ebenfalls....

    ps. nimm doch ausschlaggebende namen für die variablen

    edit:

    keine garantie, ist nicht getestet

    int aendern (char * aname)
    {
       struct telem * ptr = NULL, * vorgaenger;
       char antwort1;
       ptr=start_ptr;   
    
       while (ptr != NULL){
          if (!strcmp (ptr->fn,aname)){  
              satz_anzeigen (ptr);
              printf("\nDiesen Teilnehmer aendern [j/n]? ");
              scanf  (" %c",&antwort1); fflush(stdin); 
    
              if (antwort1 == 'j' )
                  satz_eingeben (ptr);
              else
    	      return 0;
    	  }
    
    	  else
    		  ptr=ptr->next;
       }
    return 1;
    }
    

Anmelden zum Antworten