Sortowanie listy jednokierunkowej [C]

0

Witam! Mam problem z posortowaniem listy jednokierunkowej. Program kompiluje się lecz nie sortuje. Kod poniżej. Ktoś wie, dlaczego tak się dzieje?

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

struct el
{
	int klucz;
	struct el *nast;
};

typedef struct el elListy;
typedef elListy *lista;

void WyswietlListeP( lista _lista )
 {
 	lista l = _lista;
	while ( l ){
	printf ("%d->", l->klucz);
	l = l->nast;
			  }
	printf ("\n");
 }

void DNPL (lista *l, int i) // Dodanie na poczatek listy
{
	lista p=malloc(sizeof(elListy)) ;
	if (i>0) 
	{
		p->klucz=i;
    	p->nast=*l;
    	*l=p;
	}
	else
    {
    	printf("Liczba jest ujemna. Podaj dodatnia:\n", i);
	}
}

void swap(lista *a, lista *b)
{
	int temp=(*a)->klucz;
	(*a)->klucz=(*b)->klucz;
	(*b)->klucz=temp;
}

void bublesort(lista *start)
{
	int zamieniony,i;
	lista p;
	lista l=0;
	do {
		zamieniony=0;
		p=*start;
		while(p->nast!=l)
		{
			if(p->klucz>p->nast->klucz)
			{
				swap(&p,&p->nast);
				zamieniony=1;
			}
			p=p->nast;
		}
		l=p;
	  }
	while(zamieniony);
}

lista *merge(lista *l1, lista *l2)
{
	lista *tmp=l1;
	while((*l1)->nast)
	*l1=(*l1)->nast;
	(*l1)->nast=*l2;
	bublesort(tmp);
	return tmp;
}

int main() 
 {     
 	int wybor;
	int liczba;
	struct el *l=0;
	struct el *l1=0;
	struct el *l2=0;
	int i;
	
    printf("[1] Dodanie na poczatek listy\n");
	printf("[2] Wyswietlanie listy z porzadkiem\n");
	printf("[3] Wyswietlanie listy z porzadkiem - wersja z wartownikiem\n");
	printf("[4] Wyswietl liste\n");
	printf("[5] Wyjscie z programu\n");
	do{
	printf("Wybierz: ");
	scanf("%d", &wybor);
	switch(wybor)
    	{
    	case 1:
        	printf("Podaj liczbe: ");
        	scanf("%d", &liczba);
        	DNPL(&l, liczba);
    	break;
    	case 2:
    		printf("Wyswietlanie listy z porzadkiem\n");
    		merge(&l1, &l2);
   	    break;
   	    case 3:
    		printf("Wyswietlanie listy z porzadkiem - wersja z wartownikiem\n");
    		merge(&l1, &l2);
   	    break;
    	case 4:
        	printf("Wyswietlanie listy od poczatku\n");
        	WyswietlListeP(l);
			printf("\n");
    	break;
    	case 5:
        	printf("Wyszedłes z programu!");
        	return 0;
    	break;
    }
	}while( wybor>=1 );

    return 0;
}
 
1

Daj swap kluczy i po krzyku.

0

Ale, w którym miejscu?

2

Jakoś tak:

#include <stdio.h>
#include <stdlib.h>
 
typedef struct node
  {
   int key;
   struct node *next;
  } node,*list;
 
void ShowList(list lst)
  {
   for(;lst;lst=lst->next) printf("%d->",lst->key);
   printf("\n\n");
  }

void InsertFirst(list *lst,int key) // Dodanie na poczatek listy
  {
   list p=malloc(sizeof(node)) ;
   p->key=key;
   p->next=*lst;
   *lst=p;
  }
 
void swap(int *a,int *b)
  {
   int tmp=*a;
   *a=*b;
   *b=tmp;
  }
 
void BubleSort(list *lst)
  {
   list p,q,s;
   for(s=q=NULL;;s=NULL)
     {
      for(p=*lst;p->next!=q;p=p->next)
        {
         if(p->key>p->next->key)
           {
            swap(&p->key,&p->next->key);
            s=p->next;
           }
        }
      if(!(q=s)) break;
     }
  }

list *Merge(list *l1,list *l2) // to jakiś szajs niedorobiony
  {
   list *tmp=l1;
   while((*l1)->next) *l1=(*l1)->next;
   (*l1)->next=*l2;
   BubleSort(tmp);
   return tmp;
  }
 
int main() 
  {     
   int i, choice,key;
   struct node *lst0=0,*lst1=0,*lst2=0;   
   printf("[1] Dodanie na poczatek listy\n");
   printf("[2] Wyswietlanie listy z porzadkiem\n");
   printf("[3] Wyswietlanie listy z porzadkiem - wersja z wartownikiem\n");
   printf("[4] Wyswietl liste\n");
   printf("[5] Wyjscie z programu\n");
   for(;;)
     {
      printf("Wybierz: ");
      scanf("%d",&choice);
      switch(choice)
        {
         case 1:
            printf("Podaj liczbe: ");
            scanf("%d",&key);
            if(i>0) InsertFirst(&lst0,key);
            else printf("Liczba %d jest ujemna. Podaj dodatnia.",key);
         break;
         case 2:
            printf("Sortowanie listy\n");
            BubleSort(&lst0);
         break;
         case 3:
            printf("Wyswietlanie listy z porzadkiem - wersja z wartownikiem\n");
            Merge(&lst1,&lst2);
         break;
         case 4:
            printf("Wyswietlanie listy\n");
            ShowList(lst0);
         break;
         case 5:
            printf("Wyszedłes z programu!");
         return 0;
        }
     }
  }

Z tym że wydaje mi się że chodziło o to:

void BubleSort(list *lst)
  {
   list *p,q,s;
   if((!(*lst))||(!(*lst)->next)) return;
   for(s=q=NULL;;s=NULL)
     {
      for(p=lst;(*p)->next!=q;p=&(*p)->next)
        {
         if((*p)->key>(*p)->next->key)
           {
            s=(*p)->next;
            (*p)->next=s->next;
            s->next=*p;
            (*p)=s;
            s=(*p)->next;
           }
        }
      if(!(q=s)) break;
     }
  }
0

Sortowanie już działa, ale nie mam pojęcia jak zrobić wersję z wartownikiem. Ktoś ma jakiś pomysł?
Kod wygląda teraz następująco:

#include <stdio.h>
#include <stdlib.h>
 
struct el
{
    int klucz;
    struct el *nast;
};
 
typedef struct el elListy;
typedef elListy *lista;
 
void WyswietlListeP( lista _lista )
 {
     lista l = _lista;
    while ( l ){
    printf ("%d->", l->klucz);
    l = l->nast;
              }
    printf ("\n");
 }
 
void DNPL (lista *l, int i) // Dodanie na poczatek listy
{
    lista p=malloc(sizeof(elListy)) ;
    if (i>0) 
    {
        p->klucz=i;
        p->nast=*l;
        *l=p;
    }
    else
    {
        printf("Liczba jest ujemna. Podaj dodatnia:\n", i);
    }
}
 
void swap(int *a, int *b)
{
	int tmp=*a;
	*a=*b;
	*b=tmp;
}

void Sortowanie(lista *l)
  {
   lista p,q,s;
   for(s=q=NULL;;s=NULL)
     {
      for(p=*l;p->nast!=q;p=p->nast)
        {
         if(p->klucz>p->nast->klucz)
           {
            swap(&p->klucz, &p->nast->klucz);
            s=p->nast;
           }
        }
      if(!(q=s)) break;
     }
  }
 
int main() 
 {     
     int wybor;
    int liczba;
    struct el *l=0;
    struct el *l1=0;
    struct el *l2=0;
    int i;
 
    printf("[1] Dodanie na poczatek listy\n");
    printf("[2] Wyswietlanie listy z porzadkiem\n");
    printf("[3] Wyswietlanie listy z porzadkiem - wersja z wartownikiem\n");
    printf("[4] Wyswietl liste\n");
    printf("[5] Wyjscie z programu\n");
    do{
    printf("Wybierz: ");
    scanf("%d", &wybor);
    switch(wybor)
        {
        case 1:
            printf("Podaj liczbe: ");
            scanf("%d", &liczba);
            DNPL(&l, liczba);
        break;
        case 2:
            printf("Wyswietlanie listy z porzadkiem\n");
            Sortowanie(&l);
            WyswietlListeP(l);
           break;
           case 3:
            printf("Wyswietlanie listy z porzadkiem - wersja z wartownikiem\n");
           break;
        case 4:
            printf("Wyswietlanie listy od poczatku\n");
            WyswietlListeP(l);
            printf("\n");
        break;
        case 5:
            printf("Wyszedłes z programu!");
            return 0;
        break;
    }
    }while( wybor>=1 );
 
    return 0;
}
 
 

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