Lista jednokierunkowa - usuwanie ostatniego elementu lub dodawanie nowego w dowolne miejsce

0

Witam, czy mógłby ktoś mi sprawdzić, czemu nie działają mi 2 funkcje: usuwanie_koniec (ostatni element ma być usunięty), dodawanie_dowolne(w dowolnym miejscu ma być dodany element.
Pozdrawiam

#include<stdio.h>
#include<stdlib.h>
struct baza{
	char imie[20];
	char nazwisko[20];
	int numer;
	struct baza *next;
};
void fdodawanie_na_koniec(struct baza **head);
void fdodawanie_na_poczatek(struct baza **head);
void fwypisywanie(struct baza *head);
void usuwanie_poczatek(struct baza **head);
void usuwanie_koniec(struct baza **head);
void dodawanie_dowolne(struct baza**head);
int main(void){
	struct baza *head = NULL;
	int i;
	char menu=NULL;
	printf("Wpisz a - dodac na koniec, b - dodac na poczatek, c - wyswietlic, d - usunac poczatek, e - usunac koniec, f - dodac dowolne: ");
	while(menu != 'q'){
		scanf("%c", &menu);
		if(menu == 'a')
			fdodawanie_na_koniec(&head);
		else if(menu == 'b')
			fdodawanie_na_poczatek(&head);
		else if(menu == 'c')
			fwypisywanie(head);
		else if(menu == 'd')
			usuwanie_poczatek(&head);
		else if(menu == 'e')
			usuwanie_koniec(&head); 
		else if(menu == 'f')
			dodawanie_dowolne(&head);
		while(getchar() != '\n')
			continue;
		printf("Wpisz a - dodac na koniec, b - dodac na poczatek, c - wyswietlic, d - usunac poczatek, e - usunac koniec, f - dodac dowolne: ");
	}
	system("PAUSE");
	return 0;
}
void fdodawanie_na_koniec(struct baza **head){
	struct baza*temp=(struct baza*)malloc(sizeof(struct baza));
	if( temp == NULL)
		return;
	if(*head == NULL){
		*head=temp;
	}
	else{
		struct baza*wsk = *head;
		while(wsk->next != NULL)
			wsk = wsk->next;
		wsk->next = temp;	
	}
	temp->next = NULL;
	printf("\nPodaj imie: ");
	scanf("%s", temp->imie);
	printf("\nPodaj nazwisko: ");
	scanf("%s", temp->nazwisko);
	printf("\nPodaj numer: ");
	scanf("%d", &(temp->numer));
}
void fdodawanie_na_poczatek(struct baza **head){
	struct baza*nowy = (struct baza*)malloc(sizeof(struct baza));
	printf("\nPodaj imie: ");
	scanf("%s", nowy->imie);
	printf("\nPodaj nazwisko: ");
	scanf("%s", nowy->nazwisko);
	printf("\nPodaj numer: ");
	scanf("%d", &(nowy->numer));
	nowy->next=*head;
	*head = nowy;	
}

void fwypisywanie(struct baza *head){
	struct baza*temp = head;
	while(temp != NULL){
		printf("Imie: %s Nazwsko: %s Numer: %d\n", temp->imie, temp->nazwisko, temp->numer);
		temp = temp->next;
	}
}
void usuwanie_poczatek(struct baza **head){
	if(*head == NULL){
		printf("Lista jest pusta!");
		return;
	}
	struct baza*wsk = NULL;
	wsk = (*head)->next;
	free(*head);
	*head=wsk;
}
void usuwanie_koniec(struct baza **head){
	struct baza*wsk1=NULL;
	struct baza*wsk2=NULL;
	wsk1=(*head)->next;
	wsk2=wsk1->next;
	while(wsk1->next != NULL){
		wsk1=wsk1->next;
		wsk2 = wsk2->next;
	}
	free(wsk1);
	wsk2->next = NULL;
}
void dodawanie_dowolne(struct baza**head){
	int index, i;
	struct baza*nowa = (struct baza*)malloc(sizeof(struct baza));
	struct baza* wsk;
	wsk = (*head);
	printf("Podaj numer w ktorym dodac: ");
	scanf("%d", &index);
	for(i = 0;i<index;i++)
		wsk=wsk->next;
	nowa->next = wsk->next;
	wsk->next = nowa;
	printf("\nPodaj imie: ");
	scanf("%s", nowa->imie);
	printf("\nPodaj nazwisko: ");
	scanf("%s", nowa->nazwisko);
	printf("\nPodaj numer: ");
	scanf("%d", &(nowa->numer));
} 
0

Usuwanie z końca:

void usuwanie_koniec(struct baza **head){
    struct baza*wsk1=NULL;
    struct baza*wsk2=NULL;
    wsk1=(*head)->next;
    wsk2=wsk1->next;
    while(wsk2->next != NULL){
        wsk1=wsk1->next;
        wsk2 = wsk2->next;
    }
    free(wsk2);
    wsk1->next = NULL;
}
0

No tak, tylko to usuwanie nie działa...
wsk2 ma wskazywać na przedostatni element.

0

Wyskakuje mi gdy uruchamiam tą funkcję, że program przestał działać :(

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