Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[c] Ewindecja osób (lista jednokierunkowa)

Maoi 07 Jan 2011 15:32 2096 1
  • #1
    Maoi
    Level 1  
    Witam, mam do zrobienia taki oto program:

    Napisz program w języku C pozwalający na ewidencję osób. 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

    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ą.
    * Wypisywanie ma być zrealizowane rekurencyjnie
    * Usuwanie również ma być rekurencyjne (uwaga: lista jest jednokierunkowa!).

    Do tej pory udało mi się zrobić coś takiego:


    Code:
    #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));
       
         strncpy((*head)->imie, imie, 10);
         strncpy((*head)->nazwisko, nazwisko, 10);
         strncpy((*head)->plec, plec, 10);
         (*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(p->imie,imie);
          strcpy(p->nazwisko,nazwisko);
          strcopy(p->plec, plec);
          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){
     
      el_listy *p, *p2;
      if(*head != NULL){
        if((*head)->wiek == wiek){
          p = (*head)->next;     
          free(*head);
          *head = p;
         
       }
        else{
          p2 = *head;
            p = p2->next;     
           while (p != NULL){
              if(p->wiek == wiek){
              p2->next = p->next;           
              free(p);
           
              break;
            }
              p2 = p;
            p = p->next;
           
          }
        }
      }
     
    }

    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);     
    }

    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;
    }
     


    Mógłby ktoś rzucić okiem i powiedzieć co tu się nie zgadza i co jeszcze należy poprawić ?
  • Helpful post
    #2
    kubatek94
    Level 17  
    Witaj,
    Najpierw sam przetestuj kod- podstawowe bledy:

    -na gcc musialem dodac include <stdbool.h>

    - " " w include oznacza ze pliki naglowka znajduja sie w katalogu z aplikacja- zmien to na <> bo sa to standardowe pliki .h

    - masz nie zamknieta klamre w funkcji DodajOsobe, co powoduje blad

    - funkcja UsunOsobe nic nie zwraca (void), a pozniej chcesz przypisac wartosc zwrotna w "bool czySieUdalo = UsunOsobe(10,&head)"

    -oczywiscie program nie skonczony (element = SzukajOsoby- nie masz takiej funkcji).

    Tablice na dane masz z gory ustawiona na 10 znakow- a jak ktos wpisze wiecej? Pamietaj tez o znaku "\n".
    Probuj operowac na wkaznikach do tablic i dynamicznej alokacji komorek pamieci.

    Ogolnie gcc wywala wiele warningow + errorow na poczatku. Z racji tego ze tez sie ucze programowac a nudzi mi sie to sprobuje poprawic (choc w wiekszej czesci od nowa napisac ;)) ten kod i wrzucic tutaj.

    Pozdrawiam


    EDIT:

    Pobawilem sie troche i napisalem ten program ;) Powiem szczerze ze nigdy nic nie robilem na strukturach i to bylo nie lada wyzwanie :D Kod jest w zasadzie skonczony, z tym ze nie wiem czemu nie dziala funkcja do usuwania po imieniu i nazwisku - jesli wywolasz ja np. "deleteElementData(head, "imie", "nazwisko")" to zadziala normalnie, ale jesli wejscie jest przez scanf to nie dziala - nawet po stripowaniu, musisz wiec to obbadac. Pozatym kod jest podatny na przepelnienia bufora bo nie dalem ograniczen na scanf. No i nie wiem czy kod spelnia oczekiwania autora ;p


    Kod wklejam TUTAJ (na pastie.org), bo zapisuje indentacje, oraz:

    Code:
    #include <stdio.h>
    
    #include <stdlib.h>
    #include <stdbool.h>
    #include <string.h>

    typedef struct osoba{
       int position;
       int *this;
        char *imie;
        char *nazwisko;
        char *plec;
        int wiek;
        struct osoba *next;
    } element;

    int position;
    element *osobaDodaj(element **head_ptr, char *imie, char *nazwisko, char *plec, int wiek){
       position++;
       element *temp;
       temp = malloc(sizeof(element));
       temp->next = *head_ptr;
       temp->this = (int*)temp;
       
       temp->position = position;
       temp->imie = imie;
       temp->nazwisko = nazwisko;
       temp->plec = plec;
       temp->wiek = wiek;

       *head_ptr = temp;
       return *head_ptr;

    }

    element showElements(element *head){
       printf("\nIndex\tImie\tNazwisko\tPlec\tWiek\tTHIS\tNEXT\n");
       while(head != NULL){
          printf("%i\t%s\t%s\t%s\t%i\t%x\t%x\n",
                head->position,
                head->imie,
                head->nazwisko,
                head->plec,
                head->wiek,
                (unsigned int)head->this,
                (unsigned int)head->next );
          head = head->next;
       }
    }

    element showElementIndex(element *head, int index){
       while(head != NULL){
          if(head->position == index){
             printf("Index\tImie\tNazwisko\tPlec\tWiek\n");
             printf("%i\t%s\t%s\t%s\t%i\n",
                   head->position,
                   head->imie,
                   head->nazwisko,
                   head->plec,
                   head->wiek);
             return;
          }
          head = head->next;
       }
       printf("Index %i not found!\n", index);
    }

    int deleteElementData(element *head, char *imie, char *nazwisko){
       int *index_element;
       int person_index;
       element *head_bak = head;
       element *index_next_element;

       while(head != NULL){
          if(head->imie == imie && head->nazwisko == nazwisko){
             index_element = head->this;
             person_index = head->position;

             if(head->position == 1){
                head->this = (int*)NULL;
                return 0;
             }

             head = head_bak;
             if(head->position == person_index){
                *head = *head->next;
                return 0;
             }

             while( (int*)head->next != index_element){
                head = head->next;
             }
             
             if( (int*)head->next == index_element){
                index_next_element = head->next->next;
                *head->next = *head->next->next;
                head->next = index_next_element;
                head = head->next;
                return 0;
             }            
          }
          head = head->next;
       }
       return 1;
    }

    int deleteElementIndex(element *head, int index){
       int *index_element;
       element *head_bak = head;
       element *index_next_element;

       while(head != NULL){
          if(head->position == index){
             index_element = head->this;

             if(index == 1){
                head->this = (int*)NULL;
                return 0;
             }

             head = head_bak;
             if(head->position == index){
                *head = *head->next;
                return 0;
             }

             while( (int*)head->next != index_element){
                head = head->next;
             }
             
             if( (int*)head->next == index_element){
                index_next_element = head->next->next;
                *head->next = *head->next->next;
                head->next = index_next_element;
                head = head->next;
                return 0;
             }            
          }
          head = head->next;
       }
       return 1;
    }

    void strip(char *s) {
        char *p2 = s;
        while(*s != '\0') {
            if(*s != '\t' && *s != '\n') {
                    *p2++ = *s++;
            } else {
                    ++s;
            }
        }
        *p2 = '\0';
    }

    element *head = NULL;

    int main(){
       int option;
       int result = 0;

       printf("Prosze wybrac czynnosc:\n");
       printf("1. Dodaj Osobe\n2. Wyswietl Liste\n3. Wyswietl Osobe o Indeksie\n4. Usun Osobe o Imieniu i Nazwisku\n5. Usun Osobe o Indeksie\n6. Zamknij Program\n\n");

       while( (option = getchar()) != EOF ){
          if(option == '1'){
             char imie[15];
             char nazwisko[25];
             char plec[10];
             int wiek;

             printf("\nProsze podac dane osoby:\n");
             printf("Imie:");
             scanf("%s", imie);
             printf("Nazwisko:");
             scanf("%s", nazwisko);
             printf("Plec:");
             scanf("%s", plec);
             printf("Wiek:");
             scanf("%i", &wiek);
             printf("\n\n");

             strip(imie);
             strip(nazwisko);
             strip(plec);

             head = osobaDodaj(&head, imie, nazwisko, plec, wiek);
             main();
          }

          if(option == '2'){
             showElements(head);
             main();
          }

          if(option == '3'){
             int index;
             printf("Prosze wpisac index:\n");
             scanf("%i", &index);
             showElementIndex(head, index);
             printf("\n");
             main();
          }

          if(option == '4'){
             char imie[15];
             char nazwisko[25];
             int result;

             printf("Prosze podac dane osoby:\n");
             printf("Imie:");
             scanf("%s", imie);
             printf("Nazwisko:");
             scanf("%s", nazwisko);
             printf("\n");

             strip(imie);
             strip(nazwisko);

             result = deleteElementData(head, imie, nazwisko);
             if(result != 0){
                printf("Wystapil blad\n");
                main();
             }
             main();
          }

          if(option == '5'){
             int index;
             int result;

             printf("Prosze podac index:\n");
             scanf("%i", &index);
             result = deleteElementIndex(head, index);
             
             if(result != 0){
                printf("Wystapil blad\n");
                main();
             }
             main();      
          }

          if(option == '6'){
             return 0;
          }
       }
    }



    Pozdrawiam
    Jakub