Sortowana lista oparta na strukturach

0

Witam,

Tworzę funkcję, która ma za zadanie dodawać do listy opartej na strukturach pozycje sortując je jednocześnie (tzn. wybierając odpowiednie miejsce dla dodawanej pozycji).

Struktura wygląda tak:

struct node {
	double key;
	char *val;
	struct node *next;
};

A sama funkcja tak:

struct node *insert(struct node *p, double number, char *word) {

	struct node *ptr = (struct node *)malloc(sizeof(struct node));

	if (!p) {

		ptr->key = number;
		ptr->val = (char *)malloc(sizeof(char)*(strlen(word)+1));
		strcpy(ptr->val, word);
		ptr->next = NULL;

		return p;

	}

	else {

		if (p->key > number) {

			insert(p->next, number, word);

		}

		else {

			ptr->key = number;
			ptr->val = (char *)malloc(sizeof(char)*(strlen(word)+1));
			strcpy(ptr->val, word);
			ptr->next = p;

			return ptr;

		}

	}

}

Użyłem pojedynczego wskaźnika, bo z podwójnym miałbym potem problem z wydrukowaniem wszystkich wartości. Funkcja jednak nie działa - przy wyświetlaniu (jako parametr podaje wskaźnik do pierwszego elementu) na ekranie nic się nie pojawia.

EDIT: Już widzę, że jest to głupota. Przy podwójnym wskaźniku z kolei wyświetlała się jedynie ostatnia pozycja na liście. Jak pogodzić obie sprawy?

0
struct node *insert(struct node **p, double number, char *word)
{
	struct node *ptr = (struct node *)malloc(sizeof(struct node));
	ptr->key = number;
	ptr->val = strdup(word);

	while (*p != NULL && (*p)->key > number) p = &((*p)->next);
	ptr->next = *p;
	*p = ptr;

	return ptr;
}
0

Ja robię to w ten sposób i wszystko działa.

 typedef struct lista
{
	int val;
	struct lista *prev, *next;
} el_listy;
void dodaj(el_listy **lista, int val)
{
	el_listy *temp, *nowy, *nast;
	temp = *lista;
	nowy = (el_listy*)malloc(sizeof(el_listy));
	nowy->val = val;
	if(*lista == NULL)
	{
		nowy->next = NULL;
		nowy->prev = NULL;
		*lista = nowy;
	}
	else
	{
		while(temp->val <= val && temp->next !=NULL) temp = temp->next;
		if(temp->val <= val)
		{
			if(temp->next == NULL)
			{
				nowy->prev = temp;
				nowy->next = NULL;
				temp->next = nowy;
			}
			else
			{
				nast = temp->next;
				nowy->prev = temp;
				nast->prev = nowy;
				nowy->next = nast;
				temp->next = nowy;
			}
		}
		else
		{
			if(temp->prev == NULL)
			{
				nast = temp;
				nowy->prev = NULL;
				nast->prev = nowy;
				nowy->next = nast;
				*lista = nowy;
			}
			else
			{
				temp = temp->prev;
				nast = temp->next;
				nowy->prev = temp;
				nast->prev = nowy;
				nowy->next = nast;
				temp->next = nowy;
			}
		}
	}
}

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