[C] Sortowanie listy opartej na strukturach

0

Witam, mam program
który zczytuje dane(imię nazwisko i datę urodzenia) następnie ma posortować alfabetycznie według imienia, mecze się już parę godzin ale nie mogę wpaść na to jak przy sortowaniu bąbelkowym listy w funkcji sort podmienić dwa elementy. Ta funkcja w takiej postaci jak jest gubi mi wskaźnik do pierwszego elementu.

Dzieki za pomoc.

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

struct wpis{
char *imie, *nazwisko, *datau;
struct wpis *next;
} dane;

struct wpis *dodaj_wpis;
struct wpis *poczatek = NULL;
struct wpis *koniec = NULL;

void nowy()
{
char t[20];
char r[20];
char p[20];

dodaj_wpis = malloc(sizeof (dane));
printf("Podaj imie: ");
scanf("%s", t);

dodaj_wpis->imie=malloc( sizeof(char) * strlen(t));
strcpy( dodaj_wpis->imie, t );

printf("Podaj nazwisko: ");
scanf("%s", r);

dodaj_wpis->nazwisko=malloc( sizeof(char) * strlen(r));
strcpy( dodaj_wpis->nazwisko, r );

printf("Podaj date urodzenia: ");
scanf("%s", p);

dodaj_wpis->datau=malloc( sizeof(char) * strlen(p));
strcpy( dodaj_wpis->datau, p );

dodaj_wpis -> next = NULL;

if (koniec == NULL)
poczatek = koniec = dodaj_wpis;
else {
koniec->next = dodaj_wpis;
koniec = dodaj_wpis;
}
}

void screen()
{
int lp = 1;
struct wpis *tmp;
if(poczatek != NULL)
tmp = poczatek;
else tmp == NULL; //tutaj tez nie dziala
if(tmp == NULL)
printf("Baza danych jest pusta. Wprowadz dane.\n\n");
else
while(tmp != NULL)
{
printf("%d.\t%s\t%s\t%s\n", lp, tmp->imie, tmp->nazwisko, tmp->datau);
tmp = tmp -> next;
lp++;
}

}
void sort()
{

struct wpis *temp, *temp2, *temp3, *temp4;
struct wpis pom;
int pass;

temp2 = malloc(sizeof (dane));
if (poczatek == NULL)
{
printf("Baza danych jest pusta. Wprowadz dane.\n\n");
}
else
{
while (pass)
{
pass = 0;
for (temp = poczatek; temp->next != NULL; temp = temp->next)
{
if(strcmp(temp->imie, temp->next->imie) > 0 )
{

             *temp2 = *temp->next;    // JAK TU PODMIENIĆ DWA ELEMENTY LISTY??
             *temp->next = *temp;
             *temp = *temp2;

             /*temp3 = temp->next;
             temp->next = temp;                
             temp = temp3;*/

             pass=1;
             }
          }
     }

}

}

int main()
{
int i=1;
while(i!=5){
nowy();
i++;}
screen();
printf("\n\n\n\n");
sort();
printf("jest");
screen();

system("pause");
}

0

Jak masz liste jednokierunkowa to lepiej od razu sortowac przy dodawaniu elementow o tak, np:

void dodaj(WPIS *head, char *imie)
{
      WPIS *new = (WPIS*)malloc(sizeof(WPIS));
      strcpy(new->imie, imie);
      new->next = NULL;
   
      if(head == NULL)
          pierwszy = new;
      else {
          while(head->next != NULL && strcmp(head->imie, imie) <= 0)
                head = head->next;
          if(head->next == NULL)
                head->next = new;
          else {
                new->next = head->next;
                head->next = new;
          }
      }
}
Juz masz posortowane i nie musisz sie pozniej o nic martwic;
0

Program musi mieć potem opcje sortowania według imienia nazwiska i daty urodzenia. Więc nic mi nie da to że posortuje według imienia przy wpisywaniu.

0

Zawsze możesz zrobić tak:
-jedna 'główna ' lista nie posortowana
-n 'pobocznych' list wskaźników uporządkowanych według n kryteriów

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