Daję kod źródłowy w którym nie działa sortowanie oraz zapis do pliku i proszę o pomoc.
Program miał za zadanie:
- dodawanie osoby
- usuwanie po nazwisku
- wyszukiwanie po nazwisku, wyświetla dane
- Drukowanie całej listy
- sortowanie po nazwisku albo po wieku(nie działa)
- zapis do pliku (nie działa)
- odczyt z pliku
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <io.h>
#include <cstringt.h>
using namespace std;
typedef struct osoba
{
char imie[25];
char nazwisko[50];
int wiek;
struct osoba* nast;
struct osoba* pop;
}*os_wsk;
//dodawanie nowej osoby
os_wsk dodawanie(os_wsk poprzedni)
{
//alokacja pamieci na strukture
os_wsk nowa_os = malloc(sizeof(struct osoba));
//wprowadzanie danych nowej osoby
printf("Wpisz imie: \n");
char temp[25];
scanf("%s", temp);
strcpy(nowa_os->imie, temp);
printf("Podaj Nazwisko: \n");
scanf("%s", temp);
strcpy(nowa_os->nazwisko, temp);
printf("Wprowadz swoj wiek\n");
int temp2;
scanf("%d", &temp2);
nowa_os->wiek = temp2;
// wskaźniki na następnego i poprzedniego
nowa_os->pop = poprzedni;
nowa_os->nast = NULL;
if (poprzedni != NULL)
poprzedni->nast = nowa_os;
return nowa_os;
}
//wyswietlenie jednej osoby
void wys_jednej(os_wsk szukany)
{
printf(" %s %s %d\n", szukany->imie, szukany->nazwisko, szukany->wiek);
}
//sortowanie listy
void sortowanie_listy(os_wsk* pocz_listy)
{
os_wsk nowa = NULL;
os_wsk temp;
os_wsk pom;
while (pocz_listy != NULL)
{
temp = malloc(sizeof(struct osoba));
strcpy(temp->imie, (*pocz_listy)->imie);
strcpy(temp->nazwisko, (*pocz_listy)->nazwisko);
temp->wiek = (*pocz_listy)->wiek;
temp->nast = NULL;
temp->pop = NULL;
if (nowa == NULL)
nowa = temp;
else if (strcmp(nowa->nazwisko, temp->nazwisko) > 0)
{
temp->nast = nowa;
nowa->pop = temp;
nowa = temp;
}
else
{
pom = nowa;
while (pom->nast != NULL && strcmp(pom->nast->nazwisko, temp->nazwisko) < 0)
pom = pom->nast;
temp->pop = pom;
temp->nast = pom->nast;
if (pom->nast != NULL)
pom->nast->pop = temp;
pom->nast = temp;
}
pom = (*pocz_listy);
(*pocz_listy) = (*pocz_listy)->nast;
free(pom);
}
(*pocz_listy) = nowa;
}
/*
//odczyt z pliku
void odczyt_z_pliku(char* plik,os_wsk pocz_listy)
{
FILE *ot;
ot=fopen(plik,"r");
os_wsk temp;
os_wsk pom;
if (od==NULL)
printf("nie mozna otworzyc pliku");
else
{
while(fscanf(plik,"%s %s %d",temp->imie,temp->nazwisko,&temp->wiek) != EOF)
//alokacja pamieci na nowy element
pom=(malloc(sizeof(struct osoba);
pom->nast=NULL;
pom->pop=NULL;
strcpy(temp->imie, (*pocz_listy)->imie);
strcpy(temp->nazwisko, (*pocz_listy)->nazwisko);
}
fclose(ot);
}
*/
//szukanie po nazwisku
void wyszukanie(os_wsk pocz_listy)
{
char szukam[20];
printf("Wpisz nazwisko osoby ktora chcesz znalezc\n");
scanf("%s", szukam);
os_wsk szukany = pocz_listy;
int odnaleziony = 0;
while (szukany != NULL)
{
if (strcmp(szukany->nazwisko, szukam) == 0)
{
printf("znaleziono osobę/y o takim nazwisku\n");
wys_jednej(szukany);
odnaleziony = 1;
}
szukany = szukany->nast;
}
if (odnaleziony == 0)
printf("Nie znaleziono nikogo o takim nazwisku\n");
}
//usuwanie całej listy
void usuwanie_wszystko(os_wsk pocz_listy) {
os_wsk temp = pocz_listy;
os_wsk usuwany;
while (temp != NULL)
{
usuwany = temp;
temp = temp->nast;
free(usuwany);
}
}
//usuwanie konkretnej osoby
void usuwanie_os(os_wsk* pocz_listy, os_wsk* kon_listy)
{
char szukam[25];
printf("Kogo chcesz usunac? (wpisz nazwisko)");
scanf("%s", szukam);
os_wsk szukany = *pocz_listy;
os_wsk do_usuniecia;
while (szukany != NULL)
{
if (strcmp(szukany->nazwisko, szukam) == 0)
{
//sprawdzenie czy jest jedyny element
if (szukany == *kon_listy)
{
free(szukany);
*pocz_listy = NULL;
*kon_listy = NULL;
break;
}
do_usuniecia = szukany;
if (*pocz_listy == do_usuniecia)
*pocz_listy = do_usuniecia->nast;
if (*kon_listy == do_usuniecia)
*kon_listy = do_usuniecia->pop;
szukany->pop->nast = szukany->nast;
szukany->nast->pop = szukany->pop;
szukany = szukany->nast;
free(do_usuniecia);
}
else {
szukany = szukany->nast;
}
}
}
void zapisz_do_pliku(char* plik, os_wsk pocz_listy)
{
FILE *ws;
ws = fopen(plik, "w");
os_wsk temp = pocz_listy;
if (pocz_listy == NULL)
printf("Lista jest pusta\n");
else
{
while (temp != NULL)
{
fprintf(ws, "%s %s %d\n", temp->imie, temp->nazwisko, temp->wiek);
temp = temp->nast;
}
}
fclose(ws);
}
void wyswietl_cala_liste(os_wsk pocz_listy)
{
os_wsk temp = pocz_listy;
if (temp == NULL)
printf("Lista jest pusta\n");
else
{
while (temp != NULL)
{
printf("%s %s %d\n", temp->imie, temp->nazwisko, temp->wiek);
temp = temp->nast;
}
}
}
void menu(int *w)
{
int z;
printf("Wybierz opcje\n");
printf("1-dodaj osobe\n");
printf("2-usun osobe po nazwisku\n");
printf("3-usunac cala liste\n");
printf("4-znajdz osobe\n");
printf("5-wyswietl cala liste\n");
printf("6-posortuj liste\n");
printf("7-zapisz\n");
printf("8-odczytaj\n");
printf("9-exit\n");
scanf("%d", &z);
*w = z;
}
int main(int ilosc_argumentow, char** argumenty)
{
os_wsk pocz_listy = NULL;
os_wsk kon_listy = NULL;
int k;
do
{
menu(&k);
switch (k)
{
case 1:
kon_listy = dodawanie(kon_listy);
if (pocz_listy == NULL)
pocz_listy = kon_listy;
break;
case 2:
usuwanie_os(&pocz_listy, &kon_listy);
break;
case 3:
usuwanie_wszystko(pocz_listy);
pocz_listy = NULL;
kon_listy = NULL;
break;
case 4:
wyszukanie(pocz_listy);
break;
case 5:
wyswietl_cala_liste(pocz_listy);
break;
case 6:
sortowanie_listy(&pocz_listy);
break;
case 7:
zapisz_do_pliku(argumenty[1], pocz_listy);
break;
case 8:
break;
}
} while (k != 9);
}