Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Praktische Informatik » Softwaretechnik » C - Telefonbuch Zeiger/Listen » Antwort erstellen » Hallo Gast [Anmelden|Registrieren]

Antwort erstellen
Benutzername: (du bist nicht eingeloggt!)
Thema:
Nachricht:

HTML ist nicht erlaubt
BBCode ist erlaubt
Smilies sind erlaubt
Bilder sind erlaubt

Smilies: 21 von 33
smileWinkDaumen hoch
verwirrtAugenzwinkerngeschockt
Mit ZungeGottunglücklich
Forum Kloppebösegroßes Grinsen
TanzentraurigProst
TeufelSpamWillkommen
LehrerLOL HammerZunge raus
Hilfe 
aktuellen Tag schließen
alle Tags schließen
fettgedruckter Textkursiver Textunterstrichener Text zentrierter Text Hyperlink einfügenE-Mail-Adresse einfügenBild einfügen Zitat einfügenListe erstellen CODE einfügenPHP CODE farbig hervorheben
Spamschutz:
Text aus Bild eingeben
Spamschutz

Die letzten 10 Beiträge
eulerscheZahl

Der Stringvergleich klappt so nicht, zumindest nicht in C. strcmp heißt die Funktion, nach der du und gleich auch google suchen.
Und beim Löschen kann es passieren, dass der erste Eintrag entfernt werden soll. Bei deinem aktuellen Entwurf will die aufrufende Funktion dann immer noch auf die mittlerweile gelöschte Person zugreifen. Du brauchst auch hier Person**.
LightSideOfLife

Hier auch mal mein Versuch das Löschen eines Eintrags zu realisieren:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
void Loeschen(Person *erste)
{
	Person *derzeitige = erste;
	char gesucht;
		printf("Wessen Eintrag soll gelöscht werden? (Nachname)"); scanf("%s",gesucht);
			while (derzeitige != NULL)
			{
				if (derzeitige->next->nachname == gesucht)
				{
					Person *tmp1 = derzeitige->next->next;
					free(derzeitige->next);
					derzeitige->next = tmp1;
				}
			}
		
}


Hier sagt mir der Compiler immer:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
Telefonbuch.c: In Funktion »NummerSuchen«:
Telefonbuch.c:75:30: Warnung: Vergleich zwischen Zeiger und Ganzzahl
     if (derzeitige->nachname == gesucht)
                              ^
Telefonbuch.c: In Funktion »Loeschen«:
Telefonbuch.c:88:25: Fehler: Dereferenzierung eines Zeigers auf unvollständigen Typen
     if (derzeitige->next->nachname == gesucht)
                         ^
Telefonbuch.c:90:37: Fehler: Dereferenzierung eines Zeigers auf unvollständigen Typen
      Person *tmp1 = derzeitige->next->next;
                                     ^
Telefonbuch.c:92:23: Warnung: Zuweisung von inkompatiblem Zeigertyp
      derzeitige->next = tmp1;
                       ^


Ihm scheinen also diese doppelten Pfeile nicht zu schmecken.
Außerdem wieder das "Zuweisung von inkomtabliblem Zeigertyp" Problem.
Man... Ich hab echt Verständnisprobleme bei Zeigern...
LightSideOfLife

Ok das mit dem Doppelzeiger ist jetzt etwas kompliziert für mich da muss ich mich mal genauer reinlesen und reindenken.
Außerdem beschwert sich noch mein Compiler oO

code:
1:
2:
3:
4:
5:
6:
7:
	else{
			naechste = *erste;
			while (naechste->next != NULL)
				naechste = (Person*) naechste->next;
			Person *tmp = (Person*) malloc(sizeof(Person));
			naechste->next = (Person*) tmp;
			naechste = (Person*) naechste->next;


code:
1:
2:
3:
4:
Telefonbuch.c:39:19: Warnung: Zuweisung von inkompatiblem Zeigertyp
    naechste->next = (Person*) tmp;
                   ^
eulerscheZahl

Mit Person* kannst du nur den Inhalt der Person ändern, ihr z.B. einen anderen Namen geben oder auch einen Nachfolger zuweisen. Aber es ist nicht möglich den Zeiger so zu ändern, dass die Person selbst eine andere wird. Wenn Person* vorher NULL war, musst du die Adresse von Person* ändern. Sonst kriegt die main davon nichts mit. Daher der Doppelzeiger.
Bei der Ausgabe reicht ein Zeiger - und den kann man sogar überschreiben.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct
{
	char nachname[15];
	char vorname[15];
	char wohnort[15];
	char telefonnummer[15];
	struct Person *next;
}Person;

void Hinzufuegen(Person**);
void Ausgabe(Person*);

int main()
{
	Person *erste;
	Hinzufuegen(&erste);
	Hinzufuegen(&erste);
	Ausgabe(erste);
	return 0;
}

void Hinzufuegen(Person **erste) //Doppelzeiger, weil wir nicht nur den Inhalt, sondern auch die Adresse ändern müssen
{
	Person* naechste;
	if (*erste == NULL) {
		*erste = (Person*) malloc(sizeof(Person));
		naechste = *erste;
		while (naechste->next != NULL) 
			naechste = (Person*) naechste->next;
	}
	else {
		naechste = *erste;
		while (naechste->next != NULL) 
			naechste = (Person*) naechste->next;
		Person* tmp = (Person*) malloc(sizeof(Person));
		naechste->next = (Person*) tmp;
		naechste = (Person*) naechste->next;
	}
	printf("Geben Sie den Nachnamen ein: ");		scanf("%s", naechste->nachname);
	printf("Geben Sie den Vornamen ein: "); 		scanf("%s", naechste->vorname);
	printf("Geben Sie den Wohnort ein: "); 		scanf("%s", naechste->wohnort);
	printf("Geben Sie die Telefonnummer ein: "); 	scanf("%s", naechste->telefonnummer);
}

void Ausgabe(Person *erste)
{
	int i = 1;
	while (erste != NULL)
	{
		printf("%d. Person: %s, %s, %s, %s \n",i, erste->nachname, erste->vorname, erste->wohnort, erste->telefonnummer);
		erste = (Person*) erste->next;
		i++;
	}
}
LightSideOfLife

Ich bin den Segmentation Fault jetzt losgeworden und die Eingabe durchläuft er jetzt so ohne sich zu beschweren.
Jedoch komme ich nicht in die AusgabeFunktion.
Außerdem hat es nichts gebracht malloc in der main Funktion für mein erstes Element aufzurufen sondern ich musste es in der Hinzufuegen Funktion machen. Woran liegt das?

Hier mein jetziger Code:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct
{
    char nachname[15];
    char vorname[15];
    char wohnort[15];
    char telefonnummer[15];
	struct Person *next;
}Person;

void Hinzufuegen();

void Ausgabe();

main()
{
    Person *erste, *derzeitige;
	
	erste = NULL;
	
	Hinzufuegen(erste, derzeitige);
	Hinzufuegen(erste, derzeitige);
	Ausgabe(erste);
}

void Hinzufuegen(Person *erste, Person *derzeitige)
{
	if (erste == NULL){
				
				erste = (Person *) malloc(sizeof(Person));
				printf("\nGeben Sie den Nachnamen ein\n");		gets(erste->nachname);	
				printf("\nGeben Sie den Vornamen ein\n"); 		gets(erste->vorname);
				printf("\nGeben Sie den Wohnort ein\n"); 		gets(erste->wohnort);	
				printf("\nGeben Sie die Telefonnummer ein\n"); 	gets(erste->telefonnummer);
				erste->next 			= NULL;
				derzeitige = erste;
	}
	else{
		Person *naechste;
			if (derzeitige == NULL) return;
			if (derzeitige->next != NULL) return;
			
				derzeitige->next	= malloc(sizeof(Person));
				naechste 			= (Person*) derzeitige->next;

				printf("\nGeben Sie den Nachnamen ein\n");		gets(naechste->nachname);	
				printf("\nGeben Sie den Vornamen ein\n"); 		gets(naechste->vorname);
				printf("\nGeben Sie den Wohnort ein\n"); 		gets(naechste->wohnort);	
				printf("\nGeben Sie die Telefonnummer ein\n"); 	gets(naechste->telefonnummer);
	
				naechste->next 			= NULL;
	}
}

void Ausgabe(Person *erste)
{
	int i = 1;
	Person *derzeitige = erste;
		while (derzeitige != NULL)
		{
			printf("%d. Person: %s, %s, %s, %ld \n",i, derzeitige->nachname, derzeitige->vorname, derzeitige->wohnort, derzeitige->telefonnummer);
			derzeitige = (Person*) derzeitige->next;
			i++;
		}
}


Es kommt mir so vor als wenn sich mein Programm über die Funktionsgrenzen hinaus nichts merkt...
Aber erste und derzeitige müssten doch global sein oder nicht?
eulerscheZahl

richtig.
Solltest du aber auch merken, wenn du es kompilieren willst.
LightSideOfLife

Also Änderungen an meiner Zuweisung der ersten Person?
eulerscheZahl

Du musst den Datentypen in der struct auch anpassen:
code:
1:
2:
3:
4:
5:
6:
7:
8:
typedef struct
{
    char nachname[20];
    char vorname[20];
    char wohnort[20];
    long int telefonnummer;
	struct Person *next;
} Person;

Das zieht Änderungen für die main nach sich.
LightSideOfLife

Ja gerade eben :/
Man bin ich doof...

Jetzt hab ich folgendes:

Diese Zeilen:

code:
1:
2:
3:
strcpy(naechste->nachname,n_name);
	  strcpy(naechste->vorname,v_name);
	  strcpy(naechste->wohnort,w_ort);


geben mir diese Fehlermeldung:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
Telefonbuch.c: In Funktion »Hinzufuegen«:
Telefonbuch.c:31:30: Warnung: Übergabe des Arguments 2 von »strcpy« von inkompatiblem Zeigertyp
    strcpy(naechste->nachname,n_name);
                              ^
In file included from /usr/include/stdio.h:29:0,
                 from Telefonbuch.c:1:
/usr/include/string.h:30:8: Anmerkung: »const char *« erwartet, aber Argument hat Typ »char **«
 char  *_EXFUN(strcpy,(char *__restrict, const char *__restrict));
        ^
Telefonbuch.c:32:29: Warnung: Übergabe des Arguments 2 von »strcpy« von inkompatiblem Zeigertyp
    strcpy(naechste->vorname,v_name);
                             ^
In file included from /usr/include/stdio.h:29:0,
                 from Telefonbuch.c:1:
/usr/include/string.h:30:8: Anmerkung: »const char *« erwartet, aber Argument hat Typ »char **«
 char  *_EXFUN(strcpy,(char *__restrict, const char *__restrict));
        ^
Telefonbuch.c:33:29: Warnung: Übergabe des Arguments 2 von »strcpy« von inkompatiblem Zeigertyp
    strcpy(naechste->wohnort,w_ort);
                             ^
In file included from /usr/include/stdio.h:29:0,
                 from Telefonbuch.c:1:
/usr/include/string.h:30:8: Anmerkung: »const char *« erwartet, aber Argument hat Typ »char **«
 char  *_EXFUN(strcpy,(char *__restrict, const char *__restrict));
        ^


und wenn ich es darin ändere:

code:
1:
2:
3:
	strcpy(naechste->nachname,*n_name);
	        strcpy(naechste->vorname,*v_name);
		strcpy(naechste->wohnort,*w_ort);


kriege ich einen Segmentation fault unglücklich
eulerscheZahl

Hast du string.h eingebunden?
Es sind weitere Beiträge zu diesem Thema vorhanden. Klicken Sie hier, um sich alle Beiträge anzusehen.