usuwanie z listy dwukierunkowej niecyklicznej C

0

Mam problem z funkcją usuwającą wprowadzaną wartość z listy dwukierunkowej niecyklicznej. Udało mi się to zrobić na listę jednokierunkową i wygląda i działa tak jak poniżej. Jednak z dwukierunkową nie mogę sobie poradzić. Pomoże ktoś?

void usun_wszystkie(lista *l, int i)
{
	lista pp;
	lista *p=l;
	while(p=szukaj(p,i))
	{
		pp=*p;
		*p=(*p)->nast;
		free(pp);
	}
}
 
0

na początek może więcej kodu?

0

ogólnie to w liście jednokierunkowej to musisz tylko usuwać jeden element+ustawiać wskaźnik w poprzednim elemencie na następny natomiast w dwukierunkowej trzeba dodatkowo ustawić wskaźnik następnego elementu na poprzedni

0

Cały kod wyglądał tak:

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

struct el {
        int klucz ;
         struct el *nast;
          };

 typedef struct el elListy ;
 typedef elListy * lista ;
    
void WyswietlListeP( lista _lista )
 {
 	lista l = _lista;
	while ( l ){
	printf ("%d->", l->klucz);
	l = l->nast;
			  }
	printf ("\n");
 }
 
void DNPL (lista *l, int i) // Dodanie na poczatek listy
{
	lista p=malloc(sizeof(elListy)) ;
	if (i>0) 
	{
		p -> klucz = i;
    	p -> nast = *l;
    	*l=p;
	}
	else
    {
    	printf("Liczba jest ujemna. Podaj dodatnia:\n", i);
	}
}
 
 void DNKL (lista *l, int i)
 {
 	lista p = (lista)malloc(sizeof(elListy));
 	p->klucz=i;
 	p->nast=0;
 	while ((*l))
 		l=&(*l)->nast;
 	*l=p;	
 }
 
lista *szukaj(lista *l, int i)
{
	while(*l)
	{
		if((*l)->klucz==i)
			return l;
		else
			l=&(*l)->nast;
	}
	return 0;
}

void usun_wszystkie(lista *l, int i)
{
	lista pp;
	lista *p=l;
	while(p=szukaj(p,i))
	{
		pp=*p;
		*p=(*p)->nast;
		free(pp);
	}
}

lista *szukaj_rek(lista *l,int i)
{
    if(*l==0)
        return 0;
    if((*l)->klucz==i)
        return l;
    else
        return szukaj_rek(&(*l)->nast,i);
}

void usun_wszystkie_rek(lista *l,int i)
{
    lista pp;
    lista *p=l;
        while(p=szukaj_rek(p,i))
        {
            pp=*p;
            *p=(*p)->nast;
            free(pp);
        }
}

 int main() 
 {     
 	int wybor;
	int liczba;
	lista l=0;
	int i;
	
    printf("Funkcja usuwajaca elementy z listy\n");
    printf("[1] Dodanie na poczatek listy\n");
	printf("[2] Usuwanie nierekurencyjne elementu z listy\n");
	printf("[3] Usuwanie rekurencyjne elementu z listy\n");
	printf("[4] Wyswietl liste\n");
	printf("[5] Wyjscie z programu\n");
	do{
	printf("Wybierz: ");
	scanf("%d", &wybor);
	switch(wybor)
    	{
    	case 1:
        	printf("Podaj liczbe: ");
        	scanf("%d", &liczba);
        	DNPL(&l,liczba);
    	break;
    	case 2:
    		printf("Usuwanie nierekurencyjne wszystkich powtorzen elementu z listy\n");
       		printf("Podaj liczbe: ");
        	scanf("%d", &liczba);
        	usun_wszystkie(&l,liczba);
   	    break;
        case 3:
        	printf("Usuwanie rekurencyjne wszystkich powtorzen elementu z listy\n");
       		printf("Podaj liczbe: ");
        	scanf("%d", &liczba);
        	usun_wszystkie_rek(&l,liczba);
    	break;
    	case 4:
        	printf("Wyswietlanie listy od poczatku\n ");
        	WyswietlListeP(l);
        	printf("\n");
    	break;
    	case 5:
        	printf("Wyszedłes z programu!");
        	return 0;
    	break;
    }
	}while( wybor>=1 );

    return 0;
}

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