next up previous contents
suivant: Tri par insertion monter: Corrigés des programmes précédent: Listes chaînées   Table des matières

Tri fusion

hanoi.c


#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include"linkedList.h"

void split(linkedList* source, linkedList* dest1, linkedList* dest2)
{
  link* l = linkedListUnlinkFirst(source);
  if(l != NULL)
    {
      linkedListAppendLink(dest1, l);
      split(source, dest2, dest1);
    }
}

void merge(linkedList* source1, linkedList* source2, linkedList* dest, 
	   int (*inf)(void*, void*))
{
  link *l1, *l2;
  l1 = linkedListGetFirst(source1);
  l2 = linkedListGetFirst(source2);
  if (l1 != NULL || l2 != NULL)
    {
      if (l2 == NULL || 
	  (l1 != NULL && inf(l1->data, l2->data))
	  )
	{
	  linkedListUnlinkFirst(source1);
	  linkedListAppendLink(dest, l1);
	}
      else
	{
	  linkedListUnlinkFirst(source2);
	  linkedListAppendLink(dest, l2);	
	}
      merge(source1, source2, dest, inf);
    }
}

void doNothing(void* v)
{
}

void triFusion(linkedList* l, int (*inf)(void*, void*))
{
  linkedList *l1, *l2;
  if (linkedListGetSize(l) > 1)
    {
      l1 = linkedListCreate();
      l2 = linkedListCreate();
      split(l, l1, l2);
      triFusion(l1, inf);
      triFusion(l2, inf);
      merge(l1, l2, l, inf);
      linkedListDestroy(l1, doNothing);
      linkedListDestroy(l2, doNothing);
    }
}

/*----------------------------------------------------*/

int estInf(void* i, void* j)
{
  return (*(int*)i <= *(int*)j  ) ? 1 : 0;
}

void destroyInt(void* i)
{
  free((int*)i);
}

int main()
{
  int i = 1;
  int* k;
  linkedList* l = linkedListCreate();
  link* lk;
  for(i = 100 ; i > 0 ; i--) 
    {
      k = (int*)malloc(sizeof(int));
      *k = i;
      linkedListAppend(l, k);
    }
  lk = linkedListGetFirst(l);
  while(lk!=NULL)
    {
      printf("%d ", *((int*)(lk->data)));
      lk = lk->next; 
    }
  printf("\n");
  triFusion(l, estInf);
  lk = linkedListGetFirst(l);
  while(lk!=NULL)
    {
      printf("%d ", *((int*)(lk->data)));
      lk = lk->next; 
    }
  printf("\n");
  linkedListDestroy(l, destroyInt);
  return 0;
}



klaus 2010-08-05