lista dwukierunkowa cykliczna - szukanie

0

Mam problem funkcją szukającą na liście dwukierunkowej cyklicznej. Jakiejkolwiek liczby bym nie podał funkcja nie znajduje jej na liście nawet jak podana liczba została wcześniej dodana do listy. Zna ktoś rozwiązanie tego problemu? Kod poniżej:

 
#include <stdio.h>
#include <stdlib.h>
 
struct elC
{
	int klucz ;
	struct elC *nast;
	struct elC *pop;
};
	typedef struct elC elListyC ;
	typedef elListyC* listaC ;
 
void WyswietlListe(listaC _lista)
{
	listaC l=_lista;
	if (l!= 0)
	do
	{
		printf ("%d->", l->klucz);
		l=l->nast;
	} while (l!= _lista);
	printf ("\n");
}

void DodajListaC( listaC *_lista , int i )
{
	listaC p, n;
	p=(listaC)malloc(sizeof(elListyC));
	p->klucz = i;
	if(i>=0)
	{
		if (*_lista==0)
		{
			*_lista=p;
			p->nast=p;
			p->pop=p;
		}
		else
		{
			n=(*_lista)->nast;
			p->pop=*_lista;
			p->nast=n;
			(*_lista)->nast=p;
			n->pop=p;
		}	
	}
	else
	{
		printf("Liczba jest ujemna. Podaj dodatnia:\n", i);
	}
}

void UsunListaC(listaC *_lista)
{
	listaC p;
	if (*_lista==0) return;
	if (*_lista==(*_lista)->pop)
	{
		free (*_lista );
		*_lista=0;
	}
	else
	{
		p=*_lista;
		p->pop->nast=p->nast;
		p->nast->pop=p->pop;
		*_lista=p->nast;
		free(p);
	}
}

void znajdz(listaC *_lista, int szukana)
{
    listaC *tmp=_lista;
    int x=0;
    if(*_lista!=0){
    do{
        if((*_lista)->klucz==szukana)
            {
            printf("wartosc %d znaleziona w liscie",szukana); x=1;
            break;
            }

        *_lista=(*_lista)->nast;

    }while(tmp!=_lista);
}
    if(x!=1)
        printf("wartosc %d nie znaleziona w liscie", szukana);
}

int main() 
 {     
    int wybor;
    int liczba, szukana;
    struct elC *l=0;
    int i;
 
    printf("[1] Dodanie do listy cyklicznej\n");
    printf("[2] Usuniecie pierwszego elementu z listy cyklicznej\n");
    printf("[3] Szukanie elementu liscie cyklicznej\n");
    printf("[4] Wyswietl liste cykliczna\n");
    printf("[5] Wyjscie z programu\n");
    do{
    printf("Wybierz: ");
    scanf("%d", &wybor);
    switch(wybor)
        {
        case 1:
            printf("Podaj liczbe: ");
            scanf("%d", &liczba);
            DodajListaC(&l, liczba);
        break;
        case 2:
            printf("Usuwanie pierwszego elementu listy cyklicznej\n");
            UsunListaC(&l);
           break;
           case 3:
            printf("Szukanie elementu na liscie cyklicznej\n");
            DodajListaC(&l, 3);
            DodajListaC(&l, 2);
            DodajListaC(&l, 1);
            WyswietlListe(l);
            printf("Podaj liczbe: ");
            scanf("%d", &szukana);
            znajdz(&l, szukana);
            printf("\n");
           break;
        case 4:
            printf("Wyswietlanie listy cyklicznej od poczatku\n");
            WyswietlListe(l);
            printf("\n");
        break;
        case 5:
            printf("Wyszedłes z programu!");
            return 0;
        break;
    }
    }while( wybor>=1 );
 
    return 0;
}
 
1
  1. Odradzam polskiego nazewnictwa - kiepsko na tym w końcu wyjdziesz
  2. Zrób porządną strukturę listy typedef struct { struct elC *head; } listaC; wszystko od razu czytelniejsze i wygodniejsze w obsłudze.
  3. W związku z tym że do znajdz() bez sensu przekazałeś podwójny wskaźnik to nie zauważyłeś że znajdz() psuje listę.

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