Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
10
Добавлен:
13.02.2016
Размер:
62 Кб
Скачать

¦bsearch, lfind, lsearch, and qsort

<STDLIB.H, SEARCH.H>

¦ bsearch performs a binary search

 

¦ lfind and lsearch perform a linear search

¦ qsort sorts using the quicksort algorithm

Declaration:

 

¦ void *bsearch(const void *key, const void *base, size_t nelem,

size_t width, int (*fcmp)(const void*, const void*));

¦ void *lfind(const void *key, const void *base, size_t *num,

size_t width, int (*fcmp)(const void *, const void*));

¦ void *lsearch(const void *key, void *base, size_t *num,

size_t width, int (*fcmp)(const void *, const void *));

¦ void qsort(void *base, size_t nelem,

 

size_t width, int (*fcmp)(const void *, const void *));

Function¦ What It Does

=========+==============================================================

bsearch ¦ Makes a binary search for the value *key in a table (array) of nelem elements in memory

lfind

¦ Makes a linear search for *key in an array of sequential records

lsearch ¦ Makes a linear search for *key in a table. If *key is not in the table, lsearch appends it (the

search key) to the table.

qsort

¦ Is an implementation of the "median of three" variant of the quicksort algorithm

Argument¦ What It Is/Points To

=========+===========================================================

base

¦ The base (0th element) of the search table

fcmp

¦ A user-defined comparison routine that compares two items

key

¦ and returns a value based on the comparison

¦ The item to be searched for (the search key)

nelem

¦ The number of entries in the table

num

¦ The number of entries in the table

width

¦ The number of bytes in each entry */

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

int sort_function( const void *a, const void *b);

char list[5][4] = { "cat", "car", "cab", "cap", "can" };

int main(void){

 

 

 

int

n

x;

 

 

 

 

int

= sizeof(list)/sizeof(list[0]);

 

printf("\n x =

%d\n До сортировки:",n);

 

for (x

= 0; x < n; x++)

printf("\npc [%d] = %p -> %s",

 

 

x,list[x],list[x]);

 

 

qsort((void *)list, 5, sizeof(list[0]), sort_function);

 

printf("\nПосле сортировкии:");

 

for (x

= 0;

x < n; x++)

printf("\npc [%d] = %p -> %s",

 

x,list[x],list[x]);

 

}

return 0;

 

 

 

int sort_function( const void *a, const void *b) {

 

return( strcmp((char *)a,(char *)b) ); }

x

= 5

 

 

 

 

 

pc

До сортировки:

cat

 

[0]

=

00AA

->

 

pc

[1]

=

00AE

->

car

 

pc

[2]

=

00B2

->

cab

 

pc

[3]

=

00B6

->

cap

 

pc

[4]

=

00BA

->

can

 

После сортировкии:

 

pc

[0]

=

00AA

->

cab

 

pc

[1]

=

00AE

->

can

 

pc

[2]

=

00B2

->

cap

 

pc

[3]

=

00B6

->

car

 

pc

[4]

=

00BA

->

cat

 

#include

<stdio.h>

#include

<conio.h>

#include

<stdlib.h> /* Для функции qsort() */

#include

<string.h> /* Для сравнения строк:

strcmp()

*/

/* Определение функции для сравнения: */

int compare(const void *a, const void *b) {

unsigned long *pa = (unsigned long *)a, *pb = (unsigned long *)b;

return

strcmp((char *)*pa, (char *)*pb);

//

printf(" p= %p a = %s \n",a,(char *) a);

//}

return strcmp((char *) a, (char *) b);

void

main() {

 

"One - 1", "Two - 2", "Three - 3", "Four - 4 ",

 

char *pc[] = {

 

/*

Размер таблицы:

 

"Five - 5", "Six - 6", "Seven - 7", "Eight - 8" };

 

 

*/

 

 

int n = sizeof(pc)/sizeof(pc[0]);

 

int i ;

 

 

 

 

 

 

 

clrscr();

 

 

%d\n

До сортировки:",n); for (i = 0; i < n; i++)

 

printf("\n n =

 

printf("\npc [%d] = %p -> %s",

i,pc[i],pc[i]);

 

/*

Вызов функции упорядочения: */

 

qsort((void *)

 

 

 

 

 

pc,/* Адрес

начала сортируемой таблицы */

 

n,/* Число элементов

сортируемой таблицы */

 

sizeof(pc[0]),

/* Размер одного элемента */

 

compare /* Имя

функции сравнения (указатель) */ ) ;

 

printf("\n\n

 

После сортировки:"); for (i = 0; i < n; i++)

} printf("\npc

 

[%d]

= %p ->

%s", i,pc[i],pc[i]);

n

=

8

 

 

 

 

 

 

pc

До

сортировки:

One -

1

 

[0] = 00BA ->

 

pc

[1] = 00C2 ->

Two -

2

 

pc

[2] = 00CA ->

Three

- 3

 

pc

[3] = 00D4 ->

Four - 4

 

pc

[4] = 00DE ->

Five - 5

 

pc

[5] = 00E7 ->

Six -

6

 

pc

[6] = 00EF ->

Seven

- 7

 

pc

[7] = 00F9 ->

Eight

- 8

 

pc

После сортировки:

->

Eight - 8

 

 

[0]

=

00F9

 

pc

 

[1]

=

00DE

->

Five - 5

 

pc

 

[2]

=

00D4

->

Four - 4

 

pc

 

[3]

=

00BA

->

One - 1

 

pc

 

[4]

=

00EF

->

Seven - 7

 

pc

 

[5]

=

00E7

->

Six - 6

 

pc

 

[6]

=

00CA

->

Three - 3

 

pc

 

[7]

=

00C2

->

Two – 2

 

#include <stdio.h> #include <conio.h>

#include <stdlib.h> /* Для функции qsort() */ #include <string.h>

typedef struct { char fio[15]; int old; } stud;

/* Определение функции для сравнения строк в структуре */ int compare(const void *a, const void *b) {

stud *pa = (stud *)a, *pb = (stud long *)b;

return strcmp((char *) pa->fio, (char *) pb->fio); }

void main() {

 

 

 

stud

its[5]={ {"Петров",21},{"Иванов", 20}, {"Сидоров", 18},

int i,

 

 

{"Галкина",17},{"Синичкина", 18}};

 

n = sizeof(its)/sizeof(its[0]);

 

clrscr();

 

%d\n До сортировки:",n);

 

printf("\n n =

i,&its[i],its[i].fio);

for (i

= 0;

i < n; i++) printf("\nits[%d] = %p -> %s",

qsort((void

*) its, n, sizeof(its[0]), compare ) ;

 

printf("\n\n

 

После сортировки:");

 

} for (i

= 0;

i < n; i++) printf("\nits[%d] = %p -> %s",

i,&its[i],its[i].fio);

n = 5

 

 

 

 

 

До сортировки:

Петров

 

its[0]

=

FFA0 ->

 

its[1]

=

FFB1 ->

Иванов

 

its[2]

=

FFC2 ->

Сидоров

 

its[3]

=

FFD3 ->

Галкина

 

its[4]

=

FFE4 ->

Синичкина

 

После сортировки: its[0] = FFA0 -> Галкина its[1] = FFB1 -> Иванов its[2] = FFC2 -> Петров its[3] = FFD3 -> Сидоров its[4] = FFE4 -> Синичкина

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

typedef struct

 

{ char *fio; int old; }

stud;

 

/* Определение функции для сравнения строк в структуре */

int compare(const void *a, const void *b) {

 

 

stud

**pa

= (stud **)a, **pb = (stud **)b;

 

 

return strcmp((char *) (*pa)->fio, (char *) (*pb)->fio ); }

/* Определение функции для сравнения чисел в структуре */

int compare2(const void *a, const void *b) {

 

 

stud

**pa

= (stud **)a, **pb = (stud **)b;

 

 

if(

(*pa)->old == (*pb)->old ) return 0;

 

 

if(

(*pa)->old < (*pb)->old ) return -1;

}

 

if(

(*pa)->old > (*pb)->old ) return +1;

void main() {

 

 

 

 

 

 

 

stud *its[5];

 

 

 

 

 

 

int i,

n = sizeof(its)/sizeof(its[0]);

 

 

 

clrscr();

i < n; i++) its[i]=(stud *)calloc(1,sizeof(stud));

 

for (i

= 0;

 

its[0]->fio="Петров";

 

its[0]->old =18;

 

 

its[1]->fio="Иванов";

 

its[1]->old =19;

 

 

its[2]->fio="Сидоров";

its[2]->old =18;

 

 

its[3]->fio="Галкина";

its[3]->old =21;

 

 

its[4]->fio="Синичкина";its[4]->old =16;

 

 

printf("\n n =

%d\n

До сортировки:",n);

 

 

for (i

= 0;

i < n; i++)

 

i,its[i],its[i]->fio, its[i]->old);

 

printf("\nits[%d] = %p -> %-11s %d ",

 

printf("\n\n

После 1-й сортировки:");

 

 

 

qsort((void

*)

its,

n,

sizeof(its[0]), compare ) ;

 

for (i

= 0;

i < n; i++)

 

i,its[i],its[i]->fio, its[i]->old);

 

printf("\nits[%d] = %p -> %-11s %d ",

 

qsort((void

*) its,

n,

sizeof(its[0]), compare2 ) ;

 

printf("\n\n

 

После 2-й сортировки:");

 

 

 

for (i

= 0;

i < n; i++)

 

 

 

}

printf("\nits[%d] = %p -> %-11s %d ",

i,its[i],its[i]->fio, its[i]->old);

 

n = 5

 

 

 

 

 

 

 

 

До сортировки:

Петров

 

18

 

 

its[0] =

0664

->

 

 

 

its[1] =

066C

->

Иванов

 

19

 

 

its[2] =

0674

->

Сидоров

18

 

 

its[3] =

067C

->

Галкина

21

 

 

its[4] =

0684

->

Синичкина

16

 

 

 

После 1-й сортировки:

 

21

 

 

its[0] =

067C

->

Галкина

 

 

its[1] =

066C

->

Иванов

 

19

 

 

its[2] =

0664

->

Петров

 

18

 

 

its[3] =

0674

->

Сидоров

18

 

 

its[4] =

0684

->

Синичкина

16

 

 

 

После 2-й сортировки:

 

16

 

 

its[0] =

0684

->

Синичкина

 

 

its[1] =

0674

->

Сидоров

18

 

 

its[2] =

0664

->

Петров

 

18

 

 

its[3] =

066C

->

Иванов

 

19

 

 

its[4] =

067C

->

Галкина

21

 

 

Соседние файлы в папке C_II_семестр