Discussion:
Lista cykliczna z wartownikiem
(Wiadomość utworzona zbyt dawno temu. Odpowiedź niemożliwa.)
wojciech
2006-11-07 15:57:50 UTC
Permalink
napisałem taki mały programik, który przedstawia działanie listy
dwukierunkowej cyklicznej z wartownikiem, gdzie wartownik to głowa
listy... wyświetla mi zero errorsów podaczas kompilacji ale po
uruchomieniu wyskakuje okienko "Visual Studio Just-In-Time Debugger" i nie
wiem o co chodzi... chyba mam coś źle przy dodawaniu elementów do listy...
może mi ktoś pomóc??




#include "stdafx.h"
#include "malloc.h"
#include "string.h"

typedef struct ELEMENT_LISTY{
char imie[10];
char nazwisko[10];
int wiek;
struct ELEMENT_LISTY *next, *prev;
} el_listy;


void DrukujListe(el_listy *head){

printf("\nLISTA: \n");

el_listy *p;
p = head;

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


void DodajOsobe1(char imie[10],char nazwisko[10],int wiek, el_listy **
head){

el_listy *nowy = NULL;

nowy = (el_listy *)malloc(sizeof(el_listy));

strcpy(nowy -> imie,imie);
strcpy(nowy -> nazwisko,nazwisko);
nowy ->wiek = wiek;



if(*head==NULL)
{
*head = nowy;
(*head)->next = NULL;
(*head)->prev = NULL;
}


else{
nowy -> next = (*head)->next;
(*head) -> next -> prev = nowy;
(*head) ->next =nowy;
nowy->prev = (*head);
}
}


el_listy *Szukaj(int wiek, el_listy **head)
{
el_listy *skoczek;
skoczek = *head;

while(skoczek != NULL)
{
if(wiek == skoczek->wiek)
return skoczek;
skoczek = skoczek->next;
}
return NULL;
}






void Usun(int wiek, el_listy **head)
{

el_listy *szukany = NULL;



szukany = Szukaj(wiek, head);

if(szukany == NULL)
{
printf("Nie znaleziono takiego rekordu!");
return;
}


else
{
printf("Usunalem osobe: %10s %10s
%d\n",szukany->imie,szukany->nazwisko,szukany->wiek);
szukany->prev->next =szukany->next ;
szukany->next->prev=szukany->prev;
szukany->next = NULL;
szukany->prev = NULL;
free(szukany);
}
}


void wczytajDane(el_listy ** head){
FILE *plik;
int wiek, i;
char imie[10];
char nazwisko[10];
plik=fopen("dane_lista.txt","r");
while(!feof(plik)){
fscanf(plik,"%s", &imie);
fscanf(plik,"%s", &nazwisko);
fscanf(plik,"%d", &wiek);
DodajOsobe1(imie,nazwisko,wiek, head);
i++;
}
fclose(plik);
}

int main(void){

el_listy *head = NULL;

wczytajDane(&head);

DrukujListe(head);

Usun(99, &head);

DrukujListe(head);

el_listy * element;
element = Szukaj(99,&head);
if(element != NULL) printf("Znaleziono osobe: %10s %10s
%d\n",element->imie,element->nazwisko,element->wiek);
else printf("Nie znaleziono elementu.\n");

return 0;
}
Rafal Dabrowa
2006-11-07 17:43:09 UTC
Permalink
Post by wojciech
napisałem taki mały programik, który przedstawia działanie listy
dwukierunkowej cyklicznej z wartownikiem, gdzie wartownik to głowa
listy... wyświetla mi zero errorsów podaczas kompilacji ale po
uruchomieniu wyskakuje okienko "Visual Studio Just-In-Time Debugger" i
nie wiem o co chodzi... chyba mam coś źle przy dodawaniu elementów do
listy... może mi ktoś pomóc??
To, co napisałeś nie wygląda na listę cykliczną z wartownikiem. To jest
zwykła lista dwukierunkowa, nie cykliczna.
Post by wojciech
#include "stdafx.h"
#include "malloc.h"
#include "string.h"
typedef struct ELEMENT_LISTY{
char imie[10];
char nazwisko[10];
int wiek;
struct ELEMENT_LISTY *next, *prev;
} el_listy;
void DrukujListe(el_listy *head){
printf("\nLISTA: \n");
el_listy *p;
p = head;
while( p != NULL) {
Jeśli to jest lista cykliczna z wartownikiem, to p nigdy nie może być
NULL. Bo ostatni element pokazuje na pierwszy, i tak w kółko.
Post by wojciech
printf("[%10s %10s %d]\n",p->imie,p->nazwisko,p->wiek);
printf(" ^\n");
printf(" |\n");
printf(" v\n");
p = p -> next;
}
}
void DodajOsobe1(char imie[10],char nazwisko[10],int wiek, el_listy **
head){
el_listy *nowy = NULL;
nowy = (el_listy *)malloc(sizeof(el_listy));
strcpy(nowy -> imie,imie);
strcpy(nowy -> nazwisko,nazwisko);
nowy ->wiek = wiek;
if(*head==NULL)
Jeśli head ma być wartownikiem, to powinien on zawsze istnieć, nawet
jeśli lista jest pusta.
Post by wojciech
{
*head = nowy;
(*head)->next = NULL;
(*head)->prev = NULL;
Jeśli next i prev ustawiasz na NULL to nie robisz listy
cyklicznej tylko zwykłą listę.
Post by wojciech
}
else{
nowy -> next = (*head)->next;
(*head) -> next -> prev = nowy;
(*head) ->next =nowy;
nowy->prev = (*head);
To jest OK przy liście cyklicznej, ale przy zwykłej liście nie za
bardzo. Gdybyś zaprzyjaźnił się z debuggerem to byś wiedział dlaczego,
bo najpewniej tutaj się wywala.
Post by wojciech
}
}
el_listy *Szukaj(int wiek, el_listy **head)
{
el_listy *skoczek;
skoczek = *head;
while(skoczek != NULL)
To samo co przy DrukujListe: jeśli lista jest cykliczna z wartownikiem,
to skoczek nie może być nigdy NULL-em. No, chyba że jest to lista bez
wartownika, wtedy może być NULL-em przy pustej liście. I w żadnym
innym przypadku.
Post by wojciech
{
if(wiek == skoczek->wiek)
return skoczek;
skoczek = skoczek->next;
}
return NULL;
}
[...]
Na pewno chciałeś napisać listę cykliczną z wartownikiem ?
--
Rafal

sed -e s/s/a/g <my_address >my_right_address
wojciech
2006-11-08 10:51:15 UTC
Permalink
Dzięki... odkryłem już co było źle... w elsie przy doodawaniu miałeś racje
nie miało pokazywać na NULL tylko na *head i wszystko działało... i
zmieniłem trochę przy wyświetlaniu... wielkie dzieki

Loading...