Dobry wieczór, witajcie.
Muszę zaliczyć projekt - zarządzanie listą grupy ludzi - zastosować do przechowywania ich danych listę jednokierunkową. Po niezłych trudach i wielu pomocach z sieci udało mi się uzyskać taki kod:
//#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
typedef struct Osoba
{
char imie[100];
char nazwisko[100];
int wiek;
char plec;
struct Osoba* next;
} Osoba;
// zlicza dlugosc listy
int dlugosc_listy(Osoba* lista)
{
int d = 0;
Osoba* wsk = lista;
while (wsk != NULL)
{
d++;
wsk = wsk->next;
}
return d;
}
// dodaje nowy wezel do listy
void dodaj(Osoba** lista, Osoba* nowa)
{
nowa->next = NULL;
if ((*lista) == NULL)
{
*lista = nowa;
}
else
{
Osoba* wsk = *lista;
while (wsk->next != NULL)
{
wsk = wsk->next;
}
wsk->next = nowa;
}
}
// dodaje osobe do listy
void dodajOsobe(Osoba** lista)
{
char line[500];
Osoba* nowa = (Osoba*)malloc(sizeof(Osoba));
printf("Podaj imie: ");
scanf("%s", nowa->imie);
printf("Podaj nazwisko: ");
scanf("%s", nowa->nazwisko);
printf("Podaj wiek: ");
scanf("%d", &(nowa->wiek));
printf("Podaj plec: ");
gets(line);
gets(line);
nowa->plec = line[0];
dodaj(lista, nowa);
}
//Wypisuje cala liste
void wypisz_liste(Osoba* lista)
{
Osoba* wsk = lista;
if (lista == NULL)
printf("LISTA JEST PUSTA");
else
printf("Lista zawiera %d elementow: \n", dlugosc_listy(lista));
int i = 1;
while (wsk != NULL)
{
printf("%d %s %s %d %c\n", i, wsk->imie, wsk->nazwisko, wsk->wiek, wsk->plec);
wsk = wsk->next;
i++;
}
}
//Usuwa element z listy
void usun(Osoba** lista, int ID)
{
Osoba* poprzedni = NULL;
Osoba* wsk = *lista;
int i;
for (i = 1; i < ID; i++)
{
poprzedni = wsk;
wsk = wsk->next;
}
if (poprzedni == NULL)
{
(*lista) = (*lista)->next;
free(wsk);
}
else
{
poprzedni->next = wsk->next;
free(wsk);
}
}
// Usuwa osobe po indexie
void usun_osobe(Osoba** lista)
{
int ID;
printf("Podaj indeks osoby: ");
scanf("%d", &ID);
if ((ID > dlugosc_listy(*lista)) || (ID < 1))
{
printf("Nie ma takiego indeksu");
}
else
{
usun(lista, ID);
}
}
int usun_imnaz_lista(char* im, char* naz, Osoba** lista)
{
Osoba* poprzedni = NULL;
Osoba* wsk = *lista;
while ((wsk != NULL) && ((strcmp(wsk->imie, im) != 0) || (strcmp(wsk->nazwisko, naz) != 0)))
{
poprzedni = wsk;
wsk = wsk->next;
}
if (wsk == NULL)
{
return 0;
}
else
{
if (poprzedni == NULL)
{
(*lista) = (*lista)->next;
free(wsk);
}
else
{
poprzedni->next = wsk->next;
free(wsk);
}
return 1;
}
}
//usuwa po imieniu i nazwisku
void usun_imnaz(Osoba** lista)
{
printf("Podaj imie: ");
scanf("%s", im);
printf("Podaj nazwisko: ");
scanf("%s", naz);
if (usun_imnaz_lista(im, naz, lista))
printf("Osoba zostala usunieta");
else
printf("Osoba nie zostala usunieta, nie ma takiej osoby");
}
void wypisz_osobe_lista(Osoba* lista, int ID)
{
int i;
Osoba* wsk = lista;
for (i = 1; i < ID; i++)
{
wsk = wsk->next;
}
printf("%d %s %s %d %c\n", i, wsk->imie, wsk->nazwisko, wsk->wiek, wsk->plec);
}
//wypisz osobe o podanym indexie
void wypisz_osobe(Osoba* lista)
{
int ID;
printf("Podaj numer osoby: ");
scanf("%d", &ID);
if ((ID > dlugosc_listy(lista)) || (ID < 1))
{
printf("Nie ma takiego indeksu");
}
else
wypisz_osobe_lista(lista, ID);
}
int main()
{
char im[100];
char naz[100];
Osoba* lista = NULL;
int option = 0;
while (option != 0)
{
printf("\n\n MENU");
printf("\n\n\n 0 Wyjscie z programu");
printf("\n 1 Wpisz dane osoby do bazy");
printf("\n 2 Usun osobe o podanym indeksie");
printf("\n 3 Usun osobe o podanych imieniu i nazwisku");
printf("\n 4 Wyswietl osobe o podanym indeksie");
printf("\n 5 Wyswietl cala liste\n");
scanf("%d", &option);
switch (option)
{
case 1:
printf("DODAWANIE OSOBY\n");
dodajOsobe(&lista);
break;
case 2:
printf("USUWANIE OSOBY O PODANYM INDEKSIE\n");
usun_osobe(&lista);
break;
case 3:
printf("USUWANIE OSOBY NA BAZIE IMIENIA I NAZWISKA");
usun_imnaz_lista(im, naz, &lista);
menu();
case 4:
printf("WYSWIETL OSOBE O PODANYM INDEKSIE\n");
wypisz_osobe(lista);
break;
case 5:
printf("WYSWIETL CALA BAZE\n");
wypisz_liste(lista);
break;
}
}
int key;
scanf("%d", &key);
}
Visual 2015 wysypuje mi błąd dot - scanf. Z tego co udało mi się wyczytać, da się to ominąć poprzez dodanie odpowiedniego define, przed wszystkimi includami.
Jak ruszyć z tym, że wyskakuje mi błąd podczas kompilacji dotyczący:
Error 'im': undeclared identifier
Error 'naz': undeclared identifier
Proszę o wskazówki! Pozdrawiam.