Strona 1 z 1

listy dwukierunkowe

: 10 sty 2010, o 21:36
autor: Jachu
Musze napisać program który tworzy listę, tak żeby można było do niej coś dopisywać (wskazać na jeden element i po nim dodać jakiś nowy element).

Napisałem cos takiego:

Kod: Zaznacz cały

#include <stdio.h>
#include <stdlib.h>

struct element
       {
       float wartosc;
       struct element *prev;
       struct element *next;
       };
       
int dodaj (struct element *wskazany, float liczba) 
    {
     struct element *nowy; 
     nowy=(struct element*)malloc(sizeof(struct element));
     nowy->wartosc=liczba;
     nowy->next=wskazany->next;
     nowy->prev=wskazany;
     wskazany->next=nowy; 
     nowy->next->prev=nowy;
     free(nowy);
     return 1;
    };

void wypisz (struct element *wskazany)
    {
    printf("ten element to %f
",wskazany->wartosc);
    };
    
int main(int argc, char *argv[])
{

    struct element *wskazany = NULL;
    float x;
    
    while(x!=0)
    {
    wypisz(&wskazany);
    scanf("%f",&x);
    dodaj (&wskazany,x);
    };
  
  system("PAUSE");	
  return 0;
}

Sama funkcja dodawania raczej jest dobra, ale jak pierwszy raz pościłem program to można było dopisywać poszczególne liczby, a teraz już po pierwszym się wysypuje i nie wiem dlaczego.

Poza tym mam pytanie, jak mam zrobić takie coś żebym mógł wybierać jeden element i po nim coś wpisać lub go usunąć. Bo te elementy się w ogóle nie nazywają to jak się do nich odwołać. Skoro ten pierwszy jest "wskazany"(tak go nazwałem), następny ma tylko wskaźnik do wskazanego, jeszcze następny do tego drugiego itd. to jak to zrobić żeby po wypisaniu x elementów nagle wskazać np. na 5 ? albo wypisać 5,6 i 10 ?

listy dwukierunkowe

: 11 sty 2010, o 13:33
autor: Dedemonn
Juhu pisze:Poza tym mam pytanie, jak mam zrobić takie coś żebym mógł wybierać jeden element i po nim coś wpisać lub go usunąć. Bo te elementy się w ogóle nie nazywają to jak się do nich odwołać. Skoro ten pierwszy jest "wskazany"(tak go nazwałem), następny ma tylko wskaźnik do wskazanego, jeszcze następny do tego drugiego itd. to jak to zrobić żeby po wypisaniu x elementów nagle wskazać np. na 5 ? albo wypisać 5,6 i 10 ?
Pierwszy element na liście nazywany jest 'głową'. Aby przechodzić po liście, musisz gdzieś sobie ten element zapamiętać. (najlepiej jest utworzyć kolejną strukturę 'lista', w której przechowujesz wskaźnik na głowę). Gdy chcesz odwołać się do jakiegoś elementu, to musisz znać jego wartość lub indeks w liście. Przekazujesz funkcji głowę i przechodzisz po liście dopóki go nie znajdziesz. (lub jeśli już masz strukturę 'lista', to implementujesz odpowiednią do tego funkcję, która już wie gdzie ma głowę ;])
Gdy usuwasz to dodatkowo modyfikujesz wskaźniki next, prev danych elementów.

listy dwukierunkowe

: 13 sty 2010, o 01:09
autor: soku11
Co do kodu, który się w ogólne nie kompiluje tak ogólnie:
W funkcji dodaj tworzysz nowy element za zadanym. Niby ok, ale co się stanie, jeśli wskazany będzie NULLem?
- Wysypie się na linijce: nowy->next=wskazany->next;
Co jeśli wskazany jest ostatnim elementem na liście?
- Wysypie się na linijce nowy->next->prev=nowy;
I dodatkowo czemu tworzysz nowy obiekt, dołączasz go do listy, a później od razu kasujesz?
- Wysypie się przy próbie przejście po tej liście (niewyzerowane wskaźniki)
W funkcji main:
- Niezdefiniowane zachowanie w while(x!=0). Po pierwsze, x na początku ma losowe wartości, więc albo się to wykona albo nie. I ogólnie rzecz biorąc kod może się nie skończyć (poczytaj o precyzji liczb zmiennoprzecinkowych)
- Zły argument w wywołaniu funkcji wypisz.
- Zły argument w wywołaniu funkcji dodaj.
- Sztuczne i zbędne zatrzymywanie pracy, które nie działa na każdej platformie. W dodatku z użyciem funkcji, która do tego nie służy.
Ogólnie dziwnie wygląda angielski w połączeniu z polskim w kodzie...

Pozdrawiam.

listy dwukierunkowe

: 16 sty 2010, o 01:37
autor: steal
Sztuczne i zbędne zatrzymywanie pracy, które nie działa na każdej platformie. W dodatku z użyciem funkcji, która do tego nie służy.
Więc co zalecasz?

listy dwukierunkowe

: 18 sty 2010, o 19:34
autor: soku11
1. Odpalanie tego pod terminalem.
2. Przerzucenie się na IDE, które samo zatrzymuje na końcu program i czeka na klawisz.
3. Pobranie jakiegoś znaku ze standardowego wejścia (np. getchar()).

Pozdrawiam.