Cześć, mam problem z sortowaniem listy dwukierunkowej, poprzez zwykły bubblesort. Niepoprawnie "przypinam" wskaźniki ogona listy, z czym męczę się już drugi dzień. Teoretycznie mógłbym pominąć wskaźnik na ogon i w funkcji dodającej na koniec użyć tylko wskaźnik na głowę. Jednak ta funkcja jest częścią większego programu, gdzie ogon bardzo mi się przydaje. W funkcji sort w komentarzach umieściłem to, w jaki sposób przypiąłem wskaźniki ogona, domyślam się że większość z nich nie jest poprawna. Ponadto podczas zwalniania tmp wyświetla się komunikat o nadpisaniu w pamięci. Proszę o pomoc
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 50
//-------------------------------------------------------------------------------------------------------------------------------------------------//
typedef struct osoba
{
char * imie;
}osoba;
typedef struct node
{
struct node *next, *prev;
osoba data;
}node;
typedef struct list
{
node *head, *tail;
}list;
void push_back(list *L, char *t);
void sort(node **head, node **tail);
void print(list *L);
//-------------------------------------------------------------------------------------------------------------------------------------------------//
int main()
{
list L;
L.head = NULL, L.tail = NULL;
push_back(&L, "ccc");
push_back(&L, "aaa");
print(&L);
sort(&(L.head), &(L.tail));
printf("\n");
print(&L);
push_back(&L, "bbb");
printf("\n");
print(&L);
system("pause");
return 0;
}
//-------------------------------------------------------------------------------------------------------------------------------------------------//
void push_back(list *L, char *t) // dodaje element na koniec listy
{
if (L->tail == NULL)
{
L->tail = (node*)malloc(sizeof(node));
L->head = L->tail;
L->tail->prev = NULL;
}
else
{
L->tail->next = (node*)malloc(sizeof(node));
L->tail->next->prev = L->tail;
L->tail = L->tail->next;
}
L->tail->data.imie = (char*)malloc(sizeof(char)*strlen(t) + 1);
strcpy(L->tail->data.imie, t);
L->tail->next = NULL;
}
//-------------------------------------------------------------------------------------------------------------------------------------------------//
void print(list *L)
{
int i = 0;
node *ptr = NULL;
for (i = 1, ptr = L->head; ptr != NULL; ptr = ptr->next, i++)
{
printf("%s ", ptr->data.imie);
}
}
//-------------------------------------------------------------------------------------------------------------------------------------------------//
void sort(node **head, node **tail)
{
node* poprzedni = NULL;
node *tmp = NULL, *aktualny;
if (*head == NULL)
{
printf("Lista jest pusta!\n");
return;
}
if (*head == *tail && *head != NULL)
{
printf("Lista zawiera tylko jeden element\n");
return;
}
while (*head != NULL)
{
aktualny = (node*)malloc(sizeof(node));
aktualny->data.imie = (char*)malloc(sizeof(char)* strlen((*head)->data.imie) + 1);
strcpy(aktualny->data.imie, (*head)->data.imie);
aktualny->next = NULL;
aktualny->prev = NULL;
if (poprzedni == NULL) poprzedni = aktualny;
else if (strcmp(poprzedni->data.imie, aktualny->data.imie) > 0)//sortowanie rosnace
{
aktualny->next = poprzedni;
poprzedni->prev = aktualny;
poprzedni = aktualny;
//*tail = poprzedni;
}
else
{
tmp = poprzedni;
while (tmp->next != NULL && strcmp(tmp->next->data.imie, aktualny->data.imie) < 0)
tmp = tmp->next;
aktualny->prev = tmp;
aktualny->next = tmp->next;
if (tmp->next != NULL) tmp->next->prev = aktualny;
//else *tail = aktualny;
tmp->next = aktualny;
}
tmp = *head;
*head = (*head)->next;
//if (tmp->data.imie) free(tmp->data.imie);
//free(tmp);
}
*head = poprzedni;
}