lista jednokierunkowa

0

Mam do zrobienia liste jednokierunkową z wczytaniem danych z pliku do listu
nie działa mi usuwanie pierwszego elementu z listy wiec dlatego ta funkcja jest wyłaczona z kompilacji
a poza tym wszytko dobrze kompiluje tylko nie wiem dlaczego nie chce mi wczytac danych z pilku do listu?
prosze o szybką pomoc.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct kierowca
{
	int id;
	char nazwisko[20];
	char imie[20];
	char nr_prawa_jazdy[20];
	char nr_rej_samochodu[10];
	struct kierowca *nast;
} kierowca;
   void OdczytZPliku(kierowca* poczatek) {
   kierowca* nowypocz;
   kierowca* pomoc;
    FILE* dane=fopen("dane.txt", "r");
    if(dane==NULL) {
        printf("brak pliku\n");
        return;
    }
    nowypocz=malloc(sizeof(struct kierowca));
	//pomoc=(sizeof(struct kierowca));
    while(!feof(dane))
	{
        fscanf(dane, "%s, %s, %s, &s ", nowypocz->nazwisko, nowypocz->imie, &nowypocz->nr_prawa_jazdy, &nowypocz->nr_rej_samochodu);
        if(poczatek==NULL)
            poczatek=nowypocz;
        else {
            pomoc=poczatek;
            while(pomoc->nast!=NULL)
                pomoc=pomoc->nast;
            pomoc->nast=nowypocz;
        }
    }
    fclose(dane);
}
kierowca* dodaj_element(kierowca* poczateklisty, kierowca* wprowadzany)
{
    kierowca* nowypocz;
    nowypocz = (kierowca *)malloc(sizeof(kierowca));
    nowypocz->id = wprowadzany->id;
    strcpy(nowypocz->nazwisko, wprowadzany->nazwisko);
    strcpy(nowypocz->imie, wprowadzany->imie);
    strcpy(nowypocz->nr_prawa_jazdy, wprowadzany->nr_prawa_jazdy);
    strcpy(nowypocz->nr_rej_samochodu, wprowadzany->nr_rej_samochodu);
    nowypocz->nast = poczateklisty;
    return nowypocz;
}
void pokaz_liste(kierowca* poka)
{
	int i=1;
    kierowca* pomoc = poka;
    while(pomoc != NULL)
    {
        printf("%d. Nazwisko:%s Imie:%s, Nr prawa jazdy: %s, NR rej.: %s\n", i, pomoc->nazwisko, pomoc->imie, pomoc->nr_prawa_jazdy, pomoc->nr_rej_samochodu);
		pomoc=pomoc->nast;
        i++;
    }
}
int usun_pierwszy_element(kierowca *head)
{
    if(head != NULL){
        kierowca *wprowadzany = head;
        *head = *head->nast;
        free(wprowadzany);
    }
    else{
        printf("Lista jest pusta!");
    }
}
/*int wycofanie (kierowca*head, char nazwa)
{
    int retcode;
        if(*head == NULL)
        {
                printf("Lista jest pusta!");
                retcode=0;
        }
        else{
                if (nazwa==(head)->nazwisko){
                        wprowadzony = *head;
                        *head = *head->nast;
                        free(wprowadzony);
                        retcode=1;
    }
                else
                 {
                    nowypocz = *head;
                    ostatni = (*head) -> nast;
                    }
                while (ostatni != NULL && ostani -> nazwisko != nazwa)
                 {
                    nowypocz = ostatni;
                    ostatni = ostatni->nast;
                if (ostatni == NULL)
                    retcode = 0;
                else{
                   wprowadzony = ostatni;
                   ostatni->nast=nowypocz->nast;
                   free(wprowadzony);
                   retcode=1;
}}}
return retcode;
}*/
int policz_liste(kierowca* poka)
{
    int a = 0;
    kierowca* pomoc = poka;
    while(pomoc != NULL)
            {
              a++;
              pomoc = pomoc->nast;
            }
    return a;
    }
int main()
{
		int x;
		kierowca *ostatni = NULL;
		kierowca *tmpkierowca = NULL;
        kierowca *poczateklisty = NULL;
		do{
           printf("Menu programu:\n");
			printf("1. Dodaj kierowce\n");
			printf("2. Start zawodnika\n");
			printf("3. Wycofaj zawodnika\n");
			printf("4. Wyswietl liste\n");
			printf("5. Policz liste\n");
			printf("6. Zakoncz\n");
			scanf("%d", &x);
			printf("\n");
			switch (x){
				case 1:{
					kierowca *wprowadzany = malloc(sizeof(kierowca));
					printf("Id:\n");
					scanf("%d", &wprowadzany->id);
	    			printf("Nazwisko: ");
	   				scanf("%s", &wprowadzany->nazwisko);
	    			printf("Imie: ");
	    			scanf("%s", &wprowadzany->imie);
	   				printf("Numer prawa jazdy: ");
	    			scanf("%s", &wprowadzany->nr_prawa_jazdy);
	    			printf("Numer rej. samochodu: ");
	    			scanf("%s", &wprowadzany->nr_rej_samochodu);
                    poczateklisty = dodaj_element(poczateklisty, wprowadzany);
				}break;
				case 2:{
					usun_pierwszy_element(poczateklisty);
				}break;
				case 3:{
					//wycofanie(poczateklisty);
				}break;
				case 4:{
                    pokaz_liste(poczateklisty);
				}break;
				case 5:{
					policz_liste(poczateklisty);
				}break;
			}
		}while(x != 6);
return 0;
}
1
 fscanf(dane, "%s, %s, %s, &s ", nowypocz->nazwisko, nowypocz->imie, &nowypocz->nr_prawa_jazdy, &nowypocz->nr_rej_samochodu);

Zły string formatujący (&?), nie sprawdzasz wyniku fscanf - lepiej rób to zamiast sprawdzać eof.

    nowypocz=malloc(sizeof(struct kierowca));
    //pomoc=(sizeof(struct kierowca));
    while(!feof(dane))

alokujesz przed pętlą, zamiast w pętli, co nie ma sensu

void OdczytZPliku(kierowca* poczatek) {

Przekazywanie parametru przez wartość i referencję

                    kierowca *wprowadzany = malloc(sizeof(kierowca));
                    printf("Id:\n");
                    scanf("%d", &wprowadzany->id);
                    printf("Nazwisko: ");
                    scanf("%s", &wprowadzany->nazwisko);
                    printf("Imie: ");
                    scanf("%s", &wprowadzany->imie);
                    printf("Numer prawa jazdy: ");
                    scanf("%s", &wprowadzany->nr_prawa_jazdy);
                    printf("Numer rej. samochodu: ");
                    scanf("%s", &wprowadzany->nr_rej_samochodu);
                    poczateklisty = dodaj_element(poczateklisty, wprowadzany);

alokujesz pamięć, nie zwalniasz jej, a w funkcji dodaj_element alokujesz jeszcze raz

int usun_pierwszy_element(kierowca *head)
{
    if(head != NULL){
        kierowca *wprowadzany = head;
        *head = *head->nast;
        free(wprowadzany);
    }
    else{
        printf("Lista jest pusta!");
    }
}

ta funkcja nie ma sensu. Zwalniasz pierwszy element, ale wydajesz się nie rozumieć co tu robisz - bo przed przypisaniem do pierwszego elementu przypisujesz mu zawartość następnego. Powinieneś usunąć pierwszy element, ale pierw ustawić pierwszy element na następny, ze zrozumieniem Przekazywanie parametru przez wartość i referencję

0

kq dzieki za pomoc

1 użytkowników online, w tym zalogowanych: 0, gości: 1