[C]verkette listen (funktion deklaration)

LowRydeR

Grünschnabel
Hallo zusammen hab ein kleines Problem und zwas sollte ich nach einem vorgegebenen Strucktogramm das programm schreiben, es ist eine einfach verkette Schlage die nach dem First in First out prinzip ausgegeben werden soll.
Das hab ich soweit geschafft, auch wenn man es vielleicht schöner machen kann bin ich schon glück es soweit geschafft zu haben.

Aber nun komme ich nicht weiter und brauche hilfe von erfahrenen Programmierern.

Unzwar beim kompilieren tretten 2 fehler auf:
Code:
main.c:5: parse error before "Person"
main.c:6: warning: parameter names (without types) in function declaration

Das ist die deklarations Zeile der Funktionsköpfe aber ich sehe da kein fehler vielleicht kann mir einer von euch helfen.

Das ist der Code:
Code:
void input(int, char [], Person);
void output(Person);

struct Person {
    char Name[50];
    int Alter;
    struct Person *next;
};

int main(void){
    char weiter = 'j';
    char LName[50];
    int alter;
    struct Person *base = NULL;
    do{
        printf ("Bitte Namen eingeben:");
        fflush(stdin);
        scanf("%s",LName);
        do{
                printf ("Bitte geben sie das Alter ein:");
                fflush(stdin);
                scanf("%i",&alter);
        }while(alter<=0);
        input(alter, LName, *base);
        printf("\nBei beenden werden alle Elemente ausgegeben und geloescht.");
        printf("\nWollen Sie weiter Elemente einfuegen?");
        fflush(stdin);
        scanf("%c",&weiter);
    }while(weiter == 'j' || weiter == 'J');
    output(*base);
    printf("Bitte Taste druecken ...");
    getch();
    return 0;
}

void input(int alter, char LName[], struct Person *base){
 //code nicht wichtig
}
void output(struct Person *base){
 //code nicht wichtig
}

Danke im vorraus

LowRydeR
 
Hi.

Du mußt die Struktur Person deklarieren bevor du sie das erste mal benutzt.

Du mußt immer "struct Person" schreiben wenn du eine Variable dieses Typs deklarieren willst.

Deine Deklaration und die Definition der Funktionen input bzw. output stimmen in den Typen nicht überein. (Willst du Zeiger übergeben oder die Struktur selbst)?

Du hast vergessen für die Struktur base (und die Unterelemente) Speicher (mit malloc) zu allozieren. (bzw. soll das wahrscheinlich in der input Funktion passieren, oder?!)

Gruß
 
deepthroat hat gesagt.:
Hi.
Deine Deklaration und die Definition der Funktionen input bzw. output stimmen in den Typen nicht überein. (Willst du Zeiger übergeben oder die Struktur selbst)?

Du hast vergessen für die Struktur base (und die Unterelemente) Speicher (mit malloc) zu allozieren. (bzw. soll das wahrscheinlich in der input Funktion passieren, oder?!)
Gruß
Ich wollte ein zeiger übergeben.

die resavierung mit malloc mach ich in input und löschen mit free in output nach der ausgabe.
 
LowRydeR hat gesagt.:
Ich wollte ein zeiger übergeben.

die resavierung mit malloc mach ich in input und löschen mit free in output nach der ausgabe.
Dann mußt du allerdings einen Zeiger auf einen Zeiger übergeben, denn du mußt base ja manipulieren können. Oder du arbeitest mit Rückgabewerten.

Berichtige erstmal die Fehler so das es kompiliert. Dann können wir weiter sehen.

Gruß
 
Den struct hab ich ja schon deklariert oder nicht

struct Person {
char Name[50];
int Alter;
struct Person *next;
};

danke für deine hilfe

PS
die eine fehler meldung hat sich geändert und zwar so:
main.c:5: parse error before "Person"
main.c:6: parse error before '*' token
 
So ich hab das programm endlich:
hier für die die das Programm irgendwann mal vielleicht auch brauchen werden.
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>

struct Person {
    char Name[50];
    int Alter;
    struct Person *next;
};

void input(int alter, char LName[], struct Person **base);
void output(struct Person *base);

int main(int){
    char weiter = 'j';
    char LName[50];
    int alter;
    Person *base = NULL;
    do{
        printf ("Bitte Namen eingeben: ");
		fflush(stdin);
        scanf("%s",LName);
        do{
            printf ("Bitte geben sie das Alter ein: ");
            fflush(stdin);
			scanf("%i",&alter);
        }while(alter<=0);
        input(alter, LName, &base);
        printf("Bei beenden werden alle Elemente ausgegeben und geloescht.\n");
        printf("Wollen Sie weiter Elemente einfuegen? ");
		fflush(stdin);
        scanf("%c",&weiter);
    }while(weiter == 'j' || weiter == 'J');

    output(base);
	printf("Taste druecken ...");
	getche();

	return 0;
}

void input(int alter, char LName[], struct Person **base){
    Person *ptr=*base;

    if(ptr == NULL){
        ptr = (struct Person *)malloc(sizeof(struct Person));
        *base = ptr;
    }else{
        /*Das Ende der Liste suchen*/
        while(ptr->next!=NULL){
			ptr = ptr->next;
        }
        /*Das Element erzeugen*/
        ptr->next = (struct Person *) malloc(sizeof(struct Person));
        ptr = ptr->next;
    }
    strcpy(ptr->Name, LName);
    ptr->Alter = alter;
    ptr->next = NULL;
}
void output(struct Person *base){
    Person *ptr = NULL;
    Person *old = NULL;
    ptr = base;
    while(ptr != NULL){
        printf("\n%s", ptr->Name);
        printf("\n%i", ptr->Alter);
        printf("\n---\n");
        old = ptr;
        ptr = ptr->next;
        free(old);
    }
}

BIG THX @ deepthroat für deine hilfe
 
LowRydeR hat gesagt.:
So ich hab das programm endlich:
hier für die die das Programm irgendwann mal vielleicht auch brauchen werden.

In der Form sicher nicht. Siehe unten:

LowRydeR hat gesagt.:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h> /*nichtstandard*/

struct Person {
    char Name[50];
    int Alter;
    struct Person *next;
};

void input(int alter, char LName[], struct Person **base);
void output(struct Person *base);

int main(int){
    char weiter = 'j';
    char LName[50];
    int alter;
    Person *base = NULL;
    do{
        printf ("Bitte Namen eingeben: ");
		fflush(stdin);
        scanf("%s",LName);

Immer eine Längenbeschränkung angeben. Am besten fgets oder Chuck Falconers ggets verwenden.
LName[50] wird sicherlich irgendwann zu einem Problem. Nie "Magic numbers" verwenden. Nie.

Code:
        do{
            printf ("Bitte geben sie das Alter ein: ");
            fflush(stdin);
			scanf("%i",&alter);
        }while(alter<=0);
        input(alter, LName, &base);
        printf("Bei beenden werden alle Elemente ausgegeben und geloescht.\n");
        printf("Wollen Sie weiter Elemente einfuegen? ");
		fflush(stdin);
        scanf("%c",&weiter);

Hier doch einfach getc verwenden.

Code:
    }while(weiter == 'j' || weiter == 'J');

    output(base);
	printf("Taste druecken ...");
	getche();

	return 0;
}

void input(int alter, char LName[], struct Person **base){
    Person *ptr=*base;

    if(ptr == NULL){
        ptr = (struct Person *)malloc(sizeof(struct Person));

Rückgabewert von malloc nicht mit Typecast versehen das ist scheußlicher Stil in C!
(In C++ muss man casten)
Rückgabewert von malloc nicht geprüft.
Besser wäre etwa:
Code:
if( !ptr=malloc(sizeof *ptr)) {
   /*Fehlerbehandlung hier*/
}

Code:
        *base = ptr;
    }else{
        /*Das Ende der Liste suchen*/
        while(ptr->next!=NULL){
			ptr = ptr->next;
        }
        /*Das Element erzeugen*/
        ptr->next = (struct Person *) malloc(sizeof(struct Person));
        ptr = ptr->next;
    }
    strcpy(ptr->Name, LName);
    ptr->Alter = alter;
    ptr->next = NULL;
}
void output(struct Person *base){
    Person *ptr = NULL;
    Person *old = NULL;
    ptr = base;
    while(ptr != NULL){
        printf("\n%s", ptr->Name);
        printf("\n%i", ptr->Alter);
        printf("\n---\n");
        old = ptr;
        ptr = ptr->next;
        free(old);
    }

Wer sollte bitteschön code brauchen können, der die Eingaben nach einmal ausgeben gleich wieder löscht? Eine eigene Funktion freelist könnte helfen.
Weiters würde ich noch eine Kunktion insertsorted dazutun und eine deleteelement.
etcetc. Dann würde ich die fixen Datentypen durch einen Zeiger auf void ersetzten und das ganze in ein Modul kapseln, mit Lint überprüfen und noch die Dinge wie getche (Borland) herausnehmen, weil nicht portabel.

Code:
}

BIG THX @ deepthroat für deine hilfe

Du hast noch Arbeit vor dir!


lg
Johannes
 
Zurück