Пример #1
0
Файл: slist.c Проект: 12019/SDKs
/* Perform a destructive quicksort on the items in SLIST, by repeatedly
   calling COMPARE with a pair of items from SLIST along with USERDATA
   at every iteration.  COMPARE is a function as defined above for
   slist_sort_merge().  The value of SLIST is undefined after calling
   this function.

   e.g.  slist = slist_sort (slist, compare, 0);  */
SList *
slist_sort (SList *slist, SListCompare *compare, void *userdata)
{
  SList *left, *right;

  if (!slist)
    return slist;

  /* Be sure that LEFT and RIGHT never contain the same item.  */
  left = slist;
  right = slist->next;

  /* Skip two items with RIGHT and one with SLIST, until RIGHT falls off
     the end.  SLIST must be about half way along.  */
  while (right && (right = right->next))
    {
      if (!right || !(right = right->next))
	break;
      slist = slist->next;
    }
  right = slist->next;
  slist->next = 0;

  /* Sort LEFT and RIGHT, then merge the two.  */
  return slist_sort_merge (slist_sort (left, compare, userdata),
			   slist_sort (right, compare, userdata),
			   compare, userdata);
}
Пример #2
0
void do_test(unsigned int c)
{
	unsigned int i;
	struct node *p, *n;
	SLIST_HEAD(head);

	for (i = 0; i < c; ++i) {
		p = (struct node*)malloc(sizeof(*p));

		if (!p) {
			perror("malloc failed");
			exit(1);
		}

		p->data = c - i;
		slist_add(&p->slist, &head);
	}

	slist_for_each_entry(p, &head, slist) printf("%d ", p->data);
	printf("\n");

	slist_reverse(&head);

	slist_for_each_entry(p, &head, slist) printf("%d ", p->data);
	printf("\n");

	slist_for_each_entry(p, &head, slist) p->data = (size_t)rand()%100;
	printf("before sort: ");
	slist_for_each_entry(p, &head, slist) printf("%d ", p->data);
	printf("\n");
	slist_sort(NULL, &head, int_cmp);
	printf("after sort: ");
	slist_for_each_entry(p, &head, slist) printf("%d ", p->data);
	printf("\n");
	slist_for_each_entry_safe(p, n, &head, slist) free(p);
}
Пример #3
0
int main(int argc, char *argv[])
{
	SList *l1=NULL, *l2=NULL, *l3=NULL;
	int i;

	l1 = slist_prepend(l1, 96);
	l1 = slist_prepend(l1, 39);
	l1 = slist_prepend(l1, 28);
	l1 = slist_prepend(l1, 65);
	l1 = slist_prepend(l1, 61);
	l1 = slist_prepend(l1, 00);
	l1 = slist_prepend(l1, 34);
	l1 = slist_prepend(l1, 21);
	l1 = slist_prepend(l1, 43);
	l1 = slist_prepend(l1, 48);

	l2 = slist_prepend(l2, 71);
	l2 = slist_prepend(l2, 00);
	l2 = slist_prepend(l2, 02);
	l2 = slist_prepend(l2, 62);
	l2 = slist_prepend(l2, 22);
	l2 = slist_prepend(l2, 14);
	l2 = slist_prepend(l2, 59);
	l2 = slist_prepend(l2, 28);
	l2 = slist_prepend(l2, 71);
	l2 = slist_prepend(l2, 21);
	l2 = slist_prepend(l2, 89);
	l2 = slist_prepend(l2, 94);

	l3 = slist_prepend(l3, 11);
	l3 = slist_prepend(l3, 81);
	l3 = slist_prepend(l3, 99);
	l3 = slist_prepend(l3, 47);
	l3 = slist_prepend(l3, 72);
	l3 = slist_prepend(l3, 79);
	l3 = slist_prepend(l3, 30);
	l3 = slist_prepend(l3, 66);
	l3 = slist_prepend(l3, 96);
	
	
	printf("len(l1) = %i\n", slist_length(l1));
	printf("len(l2) = %i\n", slist_length(l2));
	printf("len(l3) = %i\n", slist_length(l3));
	puts("");

	printf("l1 = "); printlist(l1);
	printf("l2 = "); printlist(l2);
	printf("l3 = "); printlist(l3);
	puts("");

	/* NOTA:
	    Si tu función concat modifica las listas pasadas (es decir, hace
	   que el último nodo de la primera apunte al primero de la segunda),
	   vas a obtener resultados distintos ya que l1 se estaría modificando.
	    Cambiar el argumento 'l1' por 'clonar(l1)' para que no se
	   modifique la lista. */
	printf("l1 ++ l2 = "); printlist(slist_concat(l1, l2));
	printf("l1 ++ [] = "); printlist(slist_concat(l1, NULL));
	printf("[] ++ l2 = "); printlist(slist_concat(NULL, l2));
	puts("");

	/* Si tu intersect cambia las listas, hacer lo mismo explicado para
	   concat.. */
	printf("l1 <inter> l2 = "); printlist(slist_intersect(l1, l2));
	printf("l1 <inter> l3 = "); printlist(slist_intersect(l1, l3));
	puts("");
	
//	slist_sort(l1,icmpM);
	printf("sort(l1) = "); printlist(slist_sort(l1,icmpM));
	puts("");

	/* NOTA:
	    Si tu lista quedó ordenada al revés, o no queda ordenada puede ser
	   por confusiones en como opera la función de comparación. Lo que debe
	   cumplir la función de comparación es:
	   		icmp(a, b) >  0   si y solo si    a > b
			icmp(a, b) == 0   si y solo si    a == b
			icmp(a, b) <  0   si y solo si    a < b

	   Los valores no son necesariamente 1 y -1. */
	   		
    return 0;
}