Naruszenie dostępu do zapisu: zmienna była nullptr

0

Cześć,

próbuje zrobić algorytm tworzący listę dwukierunkową, sortujący ją, usuwający elementy. Visual Studio wywala mi wyjątek o treści:

"Zgłoszono wyjątek: naruszenie dostępu do zapisu.

pomocniczy2 było nullptr."

w funkcji usun w lini o treści: pomocniczy2->nastepny = pomocniczy->nastepny;
wie ktoś z czego to może wynikać, albo jak to naprawić? Z góry dzięki za poświęcony czas i pomoc :D

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


// zad 1 
struct TwoWayList {
	float wartosc;
	struct TwoWayList* nastepny;
	struct TwoWayList* poprzedni;
};
// zadanie 2 
void printReversed(struct TwoWayList* glowa){

	struct TwoWayList* pomocniczy = glowa;
	while (pomocniczy->nastepny != NULL)
	{
		pomocniczy = pomocniczy->nastepny;
	}
	while (pomocniczy != NULL)
	{
		printf("%.1f, ", pomocniczy->wartosc);
		pomocniczy = pomocniczy->poprzedni;
	}
}

void add(struct TwoWayList* glowa, float liczba) {
	struct TwoWayList* nowyelement = malloc(sizeof(float) + 2 * sizeof(struct TwoWayList*));
	while (glowa->nastepny != NULL) {
		glowa = glowa->nastepny;
	}
	glowa->nastepny = nowyelement;
	nowyelement->wartosc = liczba;
	nowyelement->nastepny = NULL;
	nowyelement->poprzedni = glowa;
}
// sortowanie struktóry

void sortowanie(struct TwoWayList* glowa) {
	struct TwoWayList* druga = glowa;
	struct TwoWayList* pierwsza=glowa;
	druga = druga->nastepny;
	float zmienna;
	while (druga!= NULL ) {
		
		if (druga->wartosc < pierwsza->wartosc){
			zmienna = druga->wartosc;
			druga->wartosc = pierwsza->wartosc;
			pierwsza->wartosc = zmienna;
			//printNormal(glowa);
			//printf("\n");
			sortowanie(glowa);
		}
		druga = druga->nastepny;
		pierwsza = pierwsza->nastepny;
		
	}

}

// wypisywanie normalnie 
void printNormal(struct TwoWayList* glowa) {

	struct TwoWayList* pomocniczy = glowa;
	while (pomocniczy != NULL)
	{
		printf("%.1f, ", pomocniczy->wartosc);
		pomocniczy = pomocniczy->nastepny;
	}
}


	void usun (struct TwoWayList* glowa, float liczba) {
		struct TwoWayList* pomocniczy = glowa;

		while (pomocniczy->wartosc != liczba && pomocniczy != NULL) {
			pomocniczy = pomocniczy->nastepny;
		}
		struct TwoWayList* pomocniczy2 = pomocniczy->poprzedni;
		pomocniczy2->nastepny = pomocniczy->nastepny;
		struct TwoWayList* pomocniczy3 = pomocniczy->nastepny;
		pomocniczy3->poprzedni = pomocniczy2;
		free(pomocniczy);
	}

	

int main(int argc, char *argv[]) {

	struct TwoWayList mylist;
	mylist.wartosc = 4.5;
	mylist.nastepny = NULL;
	mylist.poprzedni = NULL;
	add(&mylist, 5);
	add(&mylist, 2);
	add(&mylist, 4);
	add(&mylist, 5);
	printReversed(&mylist);
	sortowanie(&mylist);
	printf("\n");
	printNormal(&mylist);
	usun(&mylist, 2);
	printf("\n");
	printNormal(&mylist);
	getchar();
	return 0;
}
0

Na oko nie zalokowana pamięć. W efekcie próba pisania do takiej pamięci kończy się segfaultem. Ale nie dociekałem.

0

Zamień:

while (pomocniczy->wartosc != liczba && pomocniczy != NULL) {

Na:

while (pomocniczy != NULL && pomocniczy->wartosc != liczba) {

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