Usuwanie wybranego elementu z listy dwukierunkowej

0

Witam. Mój problem polega na tym, że nie za bardzo wiem, jak usunąć wybrany element z listy dwukierunkowej, który jest pobierany od użytkownika. W moim przypadku usunąć mam element na podstawie pobranego od użytkownika roku produkcji samochodu.
Mój program wygląda następująco:

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

void wypisz_elementy_listy();
void usun_element();

struct pojazd
{
	char model[40];
	int rok_produkcji;
	float pojemnosc_silnika;
	struct pojazd *nast;
	struct pojazd *poprz;
};

struct pojazd *wsk = NULL, *glowa = NULL ;

int main()
{
	FILE *plik ;

	printf("Otwieram plik: \n");
	if ((plik = fopen("plik1.txt", "r")) == NULL)
	{
		printf("Nie udalo sie otworzyc pliku\n");
		exit(1);
	}
	printf("\t\tOtwarto!\n");

	while(!feof(plik))
	{
		if(glowa == NULL)
			glowa = wsk = (struct pojazd *)malloc(sizeof(struct pojazd)); 

		else
		{
			wsk->nast = (struct pojazd *)malloc(sizeof(struct pojazd));
			wsk = wsk->nast;
		}

		fscanf(plik, "\t%s %i %f\n", &(wsk->model), &(wsk->rok_produkcji), &(wsk->pojemnosc_silnika));
		wsk->nast = NULL;
		wsk->poprz = NULL;		
	}
	printf("Zamykam plik: \n");
	fclose(plik);
	printf("\t\tZamknieto!\n\nWypisuje elementy listy dwukierunkowej: \n");
	
	wypisz_elementy_listy();
	usun_element();
	wypisz_elementy_listy();

	return 0 ;
}

void wypisz_elementy_listy()
{
	wsk = glowa;

	while(wsk != NULL)
	{
		printf("%s	%i	%.2f\n", wsk->model, wsk->rok_produkcji, wsk->pojemnosc_silnika);
		wsk=wsk->nast;
	}
	
	printf("\n\n");
}

void usun_element()
{
	int rok;
	struct pojazd *usun;

	printf("Podaj rok produkcji samochodu ktory chcesz usunac: ");
	scanf("%i", &rok);

	if(glowa->rok_produkcji == rok)
	{
		usun = glowa;
		glowa = usun->nast;
	}

}

Zapomniałem dodać, że program póki co usuwa tylko pierwszy element.

0

Zrobiłem. Jakby ktoś był zainteresowany to proszę:

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

void wypisz_elementy_listy();
void usun_element();

struct pojazd
{
	char model[40];
	int rok_produkcji;
	float pojemnosc_silnika;
	struct pojazd *nast;
	struct pojazd *poprz;
};

struct pojazd *wsk = NULL, *glowa = NULL ;

int main()
{
	FILE *plik ;

	printf("Otwieram plik: \n");
	if ((plik = fopen("plik1.txt", "r")) == NULL)
	{
		printf("Nie udalo sie otworzyc pliku\n");
		exit(1);
	}
	printf("\t\tOtwarto!\n");

	while(!feof(plik))
	{
		if(glowa == NULL)
			glowa = wsk = (struct pojazd *)malloc(sizeof(struct pojazd)); 

		else
		{
			wsk->nast = (struct pojazd *)malloc(sizeof(struct pojazd));
			wsk = wsk->nast;
		}

		fscanf(plik, "\t%s %i %f\n", &(wsk->model), &(wsk->rok_produkcji), &(wsk->pojemnosc_silnika));
		wsk->nast = NULL;
		wsk->poprz = NULL;		
	}
	printf("Zamykam plik: \n");
	fclose(plik);
	printf("\t\tZamknieto!\n\nWypisuje elementy listy dwukierunkowej: \n");
	
	wypisz_elementy_listy();
	usun_element();
	wypisz_elementy_listy();

	return 0 ;
}

void wypisz_elementy_listy()
{
	wsk = glowa;

	while(wsk != NULL)
	{
		printf("%s	%i	%.2f\n", wsk->model, wsk->rok_produkcji, wsk->pojemnosc_silnika);
		wsk=wsk->nast;
	}
	
	printf("\n\n");
}

void usun_element()
{
	int rok;
	struct pojazd *usun;

	printf("Podaj rok produkcji samochodu ktory chcesz usunac: ");
	scanf("%i", &rok);

	if(glowa->rok_produkcji == rok)
	{
		usun = glowa;
		glowa = usun->nast;
	}

	else
	{
		wsk = glowa;
		
		while(wsk->nast->rok_produkcji != rok)
			wsk = wsk->nast;
		
		usun = wsk->nast;
		wsk->nast = wsk->nast->nast;
	}
	free(usun);
}
0

W funkcjach usun, dodaj, i tak dalej nie wypisuj niczego na ekranie. Najlepiej jak usuwasz element pytac sie w argumentach funkcji o wskaznik na element. Wtedy wiesz, ze jedyna zla wartoscia wprowadzona moze byc 0

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