[c] Ewindecja osób (lista jednokierunkowa)

0

Mam do wykonania programik, który będzie miał takie opcje :

* 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

Dane mają być pobierane z klawiatury.

* Wstawianie polega na zaalokowaniu struktury na stercie i zainicjowaniu jej odpowiednią funkcją.
* Wypisywanie ma być zrealizowane rekurencyjnie
* Usuwanie również ma być rekurencyjne (uwaga: lista jest jednokierunkowa!).
#include "stdlib.h"
#include "string.h"

typedef struct Osoba{
   char imie[10];
   char nazwisko[10];
   char plec[10];
   int wiek;
   struct Osoba * next;
   
     

} el_listy;

void PokazListe(el_listy * head){
  printf("\nLISTA: \n");

  el_listy *p;
  p = head;

  while( p != NULL) {
     printf("[%10s %10s %d]\n",p->imie,p->nazwisko,p->plec, p-> wiek);
     printf("         ^\n");
     printf("         |\n");    
    p = p->next;
  }
  printf("        NULL\n\n");
}


void DodajOsobe(const char *imie, const char *nazwisko, const char *plec, int wiek, el_listy ** head){
  if(*head==NULL){
     *head = (el_listy *)malloc(sizeof(el_listy));
     strcpy((*head)->imie,imie);
    strcpy((*head)->nazwisko,nazwisko);
    strcpy((*head)->plec,plec);
     (*head)->wiek = wiek;
     (*head)->next  = NULL;    
}
else{
    el_listy *p,*p_poprzedni;
   p_poprzedni=(*head);  
   p = (*head)->next;
   while (p != NULL){
      p_poprzedni=p;      
      p=p-> next;
    p = (el_listy *)malloc(sizeof(el_listy));
    if(p != NULL ){
      
     strcpy((*head)->imie, imie, 10);
     strcpy((*head)->nazwisko, nazwisko, 10);
     strcpy((*head)->plec, plec, 10);
      p -> wiek = wiek;    
      p->next=NULL;   
    
    }
  }   
}

el_listy * SzukajOsoby(int wiek, el_listy * head){
  el_listy * Poszukiwany;
  Poszukiwany =  head;
  while ( Poszukiwany != NULL){
    if(Poszukiwany->wiek == wiek) break;
    Poszukiwany = Poszukiwany->next;
   
  }
  return Poszukiwany;
}

void UsunOsobe(int wiek, el_listy ** head){
  bool UdaloSieUsunac = false;
  el_listy *p, *p2;
  if(*head != NULL){
    if((*head)->wiek == wiek){
      p = (*head)->next;
     
      free(*head);
      *head = p;
      UdaloSieUsunac = true;
   }
    else{
      p2 = *head;
        p = p2->next;      
       while (p != NULL){
          if(p->wiek == wiek){ 
          p2->sasiad_nast = p->next;
           
          free(p);
          UdaloSieUsunac = true;
          break;
        }
          p2 = p;
        p = p->next;
       
      }
    }
  }
  return UdaloSieUsunac;
}


void wczytajDane(el_listy ** head){
    struct   Osoba abc;
       printf("imie:");
       scanf("%d", &abc.imie);
       printf("nazwisko:");
       scanf("%d", &abc.nazwisko);
       printf("plec:");
       scanf("%d", &abc.plec);
       printf("wiek:");
       scanf("%d", &abc.wiek);
       return abc;

} 

int main(void){

  el_listy * head = NULL;

  wczytajDane(&head);  

  PokazListe(head);

  bool czySieUdalo = UsunOsobe(10,&head);
  if(czySieUdalo) printf("Usunieto osobe.\n");
  else printf("Nie usunieto osoby.\n");

  PokazListe(head);

  el_listy * element;
  element = SzukajOsoby(66,head);
  if(element != NULL) printf("Znaleziono element.\n");
  else printf("Nie znaleziono elementu.\n");

  return 0;
}



Chciałbym, żeby ktoś rzucił okiem i sprawdził na ile to co mam obecnie ma sens i w razie czego wspomógł przy ewentualnych błędach.

0

Osoba abc;

to jest C++ a nie C. C wymaga tutaj słowa struct:

struct Osoba abc;

jeżeli to ci się kompiluje, to znaczy że kompilujesz kod jako C++ a nie C.

0

Rzeczywiście, mała pomyłka. Kod się nie kompiluje, poza tym nie bardzo wiem jak ugryźć te 3 punkty:

  1. usuwanie osoby o podanym indeksie
  2. usuwanie osoby o podanym imieniu-i-nazwisku
  3. wyświetlanie osoby o podanym indeksie

Mógłby ktoś pomóc ?

0
bump napisał(a)

Mam do wykonania programik, który będzie miał takie opcje :

Ja tylko w kwestii błędów:

bump napisał(a)
#include "stdlib.h"
#include "string.h"

typedef struct Osoba{
   char imie[10];
   char nazwisko[10];
   char plec[10];
   int wiek;
   struct Osoba * next;
} el_listy;

// ...

void DodajOsobe(const char *imie, const char *nazwisko, const char *plec, int wiek, el_listy ** head){
  if(*head==NULL){
     *head = (el_listy *)malloc(sizeof(el_listy));
     strcpy((*head)->imie,imie);
     strcpy((*head)->nazwisko,nazwisko);
     strcpy((*head)->plec,plec);
     (*head)->wiek = wiek;
     (*head)->next  = NULL;    
}

Nie masz żadnego kodu kontroli danych wejściowych. W strukturze ograniczasz długość znaków w tablicy do 10, ale później nigdzie nie wymagasz stosowania się do tego ograniczenia, zatem user wpisujący Ci np. imię o długości 40 znaków zrobi Ci kuku.
Zamiast strcpy() użyj strncpy():

     strcpy((*head)->imie, imie, 10);
     strcpy((*head)->nazwisko, nazwisko, 10);
     strcpy((*head)->plec, plec, 10);

lub pluj błędem userowi, jeśli ten wpisze dłuższy ciąg.

0

Fuj... Autokorekta

     strncpy((*head)->imie, imie, 10);
     strncpy((*head)->nazwisko, nazwisko, 10);
     strncpy((*head)->plec, plec, 10);
0

Dzieki.

Program wykrzacza się w tym fragmencie, co jest nie tak?

void UsunOsobe(int wiek, el_listy ** head){
  bool UdaloSieUsunac = false;
  el_listy *p, *p2;
  if(*head != NULL){
    if((*head)->wiek == wiek){
      p = (*head)->next;
     
      free(*head);
      *head = p;
      UdaloSieUsunac = true;
   }
    else{
      p2 = *head;
        p = p2->next;      
       while (p != NULL){
          if(p->wiek == wiek){ 
          p2->sasiad_nast = p->next;
           
          free(p);
          UdaloSieUsunac = true;
          break;
        }
          p2 = p;
        p = p->next;
       
      }
    }
  }
  return UdaloSieUsunac;
}
 

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