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-wertwhile (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-wertwhile (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; }