C-Struktury listy baza danych osobowych

0

Witam mam do zrobienia takie zadanie ale mam kilka problemów

  1. Nie wiem jak zrobić wskaźnik do następnej osoby
  2. Czy indeks to liczba tworzona przy powstaniu obiektu osoba czyli dla pierwszej osoby indeks jest 1 dla drugiej 2 itd?
  3. -Wstawianie polega na zaalokowaniu struktury na stercie i zainicjowaniu jej odpowiednią funkcją.
  • Usuwanie osoby polega na usunięciu węzła z pamięci i wykonaniu odpowiednich dowiązań w jego poprzedniku. Prosił bym o pomoc w tych dwóch punktach. A treść zadania
    Napisz program przechowujący dane o osobach. Powinien on (w pętli) pobierać polecenie od użytkownika i je wykonywać. Polecenia dotyczą operacji na liście osób:

    • wstawianie osoby o podanych atrybutach do listy
    • usuwanie osoby o podanym indeksie
    • usuwanie osoby o podanym imieniu-i-nazwisku
    • wyświetlanie osoby o podanym indeksie
    • wyświetlanie całej listy

Najpierw pobiera się jednoliterowy kod polecenia, a następnie dodatkowe parametry.

Osoby mają być reprezentowane jako struktury typu osoba z polami:

* imię i nazwisko
* płeć
* wiek
* wskaźnik do następnej osoby

Uwagi

* Wstawianie polega na zaalokowaniu struktury na stercie i zainicjowaniu jej odpowiednią funkcją.
* Usuwanie osoby polega na usunięciu węzła z pamięci i wykonaniu odpowiednich dowiązań w jego poprzedniku.

Program ma być napisany w czystym C, a więc należy używać funkcji języka C: malloc(), free(), printf(), scanf() zamiast ich odpowiedników z C++.

0

Ad 1.

struct Osoba
  {
   struct Osoba *NastepnaOsoba;
  };

Ad 2. Indeks to numer pozycji na liście nie koniecznie numeracja musi być od 1.

0

A jak zaalokować tą strukturę na stercie? Robię to w pętli while i do każdego podpunktu dołączyłem case. Tylko nie dodać nowej osoby wciąż wyskakują mi jakieś błędy

0

struct Osoba NowaOsoba=(struct Osoba)malloc(sizeof(struct Osoba));

0

I tak zrobiłem ale mi nie działa gdzie popełniłem bląd?

#include<stdio.h>
#include<cstdlib>

typedef struct osoba{
       char imie[30];
       enum plec {kobieta, mezczyzna};
       int wiek;
       struct osoba *next;
       }osoba;
void wstaw(osoba *o, char *dane, int lata, osoba* nastepna);
int main(){
 while(true){
             int polecenie;
             printf("Polecenia\n1 - Dodaj osobe\n2 - Usun osobe o podanym indeksie\n");
             printf("3 - Usun osobe o podanym imieniu i nazisku\n");
             printf("4 - Wyswietlanie osoby o podanym indeksie\n");
             printf("5 - Wyswietlanie calej listy\n");
             scanf("%d" , &polecenie);
             switch(polecenie){
                               case 1:
                                    printf("Podaj imie i nazwisko:\n");
                                    char imie[40];
                                    int rok;
                                    scanf("%s" , &imie);
                                    printf("Podaj wiek:\n");
                                    scanf("%d" , &rok);
                                    osoba *dodaj;
                                    dodaj = (osoba*) malloc(sizeof(osoba));
                                    wstaw(dodaj, imie, rok, dodaj);
                                    break; 
                               case 2:
                                    printf("Podaj imie:\n");
                                    break; 
                               case 3:
                                    printf("Polecenie 3\n");
                                    break; 
                               case 4:
                                    printf("Polecenie 4\n");
                                    break; 
                               case 5:
                                    printf("Polecenie 5\n");
                                    break; 
                               default:
                                      printf("Bledne polecenie\n");
                                      } 
             }   
    
}
void wstaw(osoba *o, char dane[], int lata, osoba *nastepna){
     
     o->wiek = lata;
     o->imie = dane;
     o->next = nastepna;
     }
 
0

skoro

Program ma być napisany w czystym C,
to

#include<stdlib.h>

a nie#include <cstdlib>

0

Akurat to nie jest błędem. Funkcja wstaw nie działa.

0

Bo szczerze powiedziawszy nie mam pojęcia jak dodać nową osobę do listy. Robię to metodą prób i błędów licząc, że w końcu się uda. Ale póki co nic z tego nie wychodzi. Dlatego potrzebuje pomocy w stworzeniu tej listy. Jak mam dodać osobę?

0

Gdzie masz głowę listy? dlaczego nie alokujesz tej pamięci w funkcji?
w main ewentualnie zostaw

                     printf("Podaj imie i nazwisko:\n");
                                    char imie[40];
                                    int rok;
                                    scanf("%s" , &imie);
                                    printf("Podaj wiek:\n");
                                    scanf("%d" , &rok)

a resztę rób w funkcji.

0

Ok rozumiem. Wytłumacz jeszcze o co chodzi z tą głową listy

0
_13th_Dragon napisał(a):

Ad 1.

struct Osoba
  {
   struct Osoba *NastepnaOsoba;
  };

Ad 2. Indeks to numer pozycji na liście nie koniecznie numeracja musi być od 1.

A jak mam się dostać do tego indeksu jeśli chce go usunąć?

0

A jak się dostajesz do 3-ciej książki na półce? Zwyczajnie liczysz do 3-ch.

0

Dobrze ale muszę stworzyć jakąś zmienną indeks? Czy przy tworzeniu listy już coś takiego istnieje

0
prykaz napisał(a):

Dobrze ale muszę stworzyć jakąś zmienną indeks? Czy przy tworzeniu listy już coś takiego istnieje
Czy na tej półce z książkami na każdej napisano jaki ma numer? Nie, są to zwykłe książki. Ale nie mniej jednak jakoś potrafisz wziąć trzecią?

0

Tutaj bardziej potrzebujesz ręki, która zawsze wie gdzie jest pierwsza książka.. a jak wie gdzie jest pierwsza, to potrafi się przesunąć o te trzy książki w prawo..

0

Dobrze tylko ja wciąż nie wiem jak taką rękę wykonać. Zrobiłem wszystkie punkty w zadaniu z wyjątkiem - usuwanie osoby o podanym indeksie i dodawanie osoby o podanym indeksie.

0

A wyświetlanie listy też zrobiłeś?
I zwolnienie pamięci zajmowana przez listę też?

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