Listy - dodawanie nowych elementów

0

Witam wszystkich,
Mam następujący kod, w którym operuje na prosty listach ale pomimo kompilacji, program nie działa. Mógłby ktoś sprawdzić co jest nie tak?

 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
typedef struct Human Human; 
struct Human{ 
    char Name; 
    Human *FirstSon; 
}; 
 
Human *NPotomek(Human *p, unsigned int nrPotomka){ 
    int i; 
    if(nrPotomka == 0){ return p;} 
    else { 
        for(i=0;i<nrPotomka;i++){ 
            p=p->FirstSon; 
        } 
    } 
    return p; 
 
} 
 
Human *OstPotomek(Human *ost){ 
    while(ost->FirstSon){ 
        ost=ost->FirstSon; 
    } 
    return ost; 
} 
 
unsigned IleOsob(Human *p){ 
    unsigned c = 0; 
    while(p){ 
        c++; 
        p=p->FirstSon; 
    } 
    return c; 
} 
 
void DodawaniePocz(Human *head, char v){ 
    Human *p; 
    p = (Human*) malloc(sizeof(Human)); 
    p->Name = v; 
    p->FirstSon = head; 
    head = p; 
} 
 
void UsuwaniePocz(Human *head){ 
    Human *p; 
    p=head; 
    if(p){ 
        head = p->FirstSon; 
        free(p); 
    } 
} 
 
void LiczbaElem(Human *p){ 
    unsigned i; 
    Human *tmp; 
    printf("Liczba elementow w liscie to: %i \n",IleOsob(p)); 
    for(tmp=p;tmp!=NULL;tmp=tmp->FirstSon){ 
        printf("#%i %c \n",i++,tmp->Name); 
    } 
} 
 
 
 
int main(){ 
 
    Human *L = NULL; 
    DodawaniePocz(L, 'A'); 
    DodawaniePocz(L, 'B'); 
    DodawaniePocz(L, 'C'); 
    DodawaniePocz(L, 'D');     
    LiczbaElem(L); 
 
    return 0; 
} 
 
0
  • Przekazujesz do funkcji nulla i traktujesz head jako tail (HEAD NIE POWINIEN SIE ZMIENIAC!)
  • przekazujesz do funkcji kopie przez co w funkcji main nadal masz nulla
  • przez to ze heada traktujesz jako tail, nie masz od kad zaczac wypisywanie. (bo wskaznik jest na koncu listy)

Powinienes zrobic cos takiego ze najpierw tworzysz heada w main (i alokujesz do niego juz pierwszy obiekt) a nastepnie do niego (head->next) dopisujesz nowe struktury. Jak dodawac? W funkcji ktorej przekazesz kopie (tak jak teraz) Robisz petle

while(head->next)
{
  head = head->next
}
// tutaj tworzysz nowy obiekt i przypisujesz do head->next

wyswietlanie jest analogiczne jak do przypisywania tylko nic nie zmieniasz, zamaist tego wyswietlasz

1
    Human *L = NULL; 
    DodawaniePocz(L, 'A'); 
printf("L=%P; <= ZASTANOW SIE CZEMU NADAL JEST NULL'EM\n",L);
    DodawaniePocz(L, 'B');

Tu jest podobny problem Przekazywanie struktury do funkcji, wyswietlanie elementow struktury

0

Czy w takim razie trzeba zastosować wskaźnik na wskaźnik? Chodziło o stworzenie listy do której elementy będą dostawiane z przodu. Jeśli to możliwe prosiłbym chociaż o napisanie jak będzie wyglądało dodawanie. Do stosu jeszcze na zajęciach nie doszliśmy więc na razie chodzi o proste operacje na listach jednokierunkowych

0

TAKA WSKAZÓWKA

 
struct element
{
     struct element *nast;
     struct element *poprz;
};

struct element *pierwszy = NULL;
struct element *ostatni = NULL;

void dodaj()
{
     struct element *nowy = new struct element;
     if(!pierwszy) //jesli lista pusta
     {
          pierwszy = nowy;// nowy jest pierwszym el
          ostatni = nowy; //nowy jest ostatnim el
          nowy -> nast = NULL; //nie ma nic po nowym
          nowy -> poprz = NULL; // nie ma nic przed nowym
     }
     else //jesli jest juz jakis element
     {
          nowy -> poprz = ostatni; // ostatni element bdzie teraz przed nowym, czyli nowy będzie za nim.
          nowy -> nast = NULL; // po nowym nie ma nic
          ostatni = nowy; // nowy jest ostatnim elementem
     }
}
0

Funkcja dodawania wygląda tak:

 void DodawaniePocz(Human **head, char v){
    Human *p;
    p = (Human*) malloc(sizeof(Human));
    p->Name = v;
    p->FirstSon = *head;
    *head = p;
} 

Wywołanie funkcji:

 
    Human *L = NULL;
    DodawaniePocz(&L, 'A');  
 

I działa :) Tylko dlaczego jest to wskaźnik na wskaźnik **head a nie po prostu wskaźnik *head ?

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