Data_Structure/資料結構光碟檔/CH08/heap.c.txt

220 lines
6.4 KiB
Plaintext
Raw Normal View History

2025-01-20 21:25:33 +08:00
/* file name: heap.c */
/* <20>Q<EFBFBD>ΰ<EFBFBD><CEB0>n<EFBFBD><6E>(heap tree)<29>B<EFBFBD>z<EFBFBD>|<7C><><EFBFBD>i<EFBFBD>X<EFBFBD><58><EFBFBD><EFBFBD>--<2D><><EFBFBD>J<EFBFBD>B<EFBFBD>x<EFBFBD>s<EFBFBD>B<EFBFBD><42><EFBFBD>J<EFBFBD>B<EFBFBD>R<EFBFBD><52><EFBFBD>B<EFBFBD><42><EFBFBD>X */
#include <stdio.h>
#include <stdlib.h>
#define MAX 100 /* <20>]<5D>w<EFBFBD>W<EFBFBD><57> */
void insert_f(void); /* <20><><EFBFBD>J<EFBFBD><4A><EFBFBD><EFBFBD> */
void delete_f(void); /* <20>R<EFBFBD><52><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
void display_f(void); /* <20><><EFBFBD>X<EFBFBD><58><EFBFBD><EFBFBD> */
void create(int); /* <20>إ߸<D8A5><DFB8>Ʃ<EFBFBD><C6A9><EFBFBD><EFBFBD>n<EFBFBD><6E> */
void removes(int); /* <20>q<EFBFBD><71><EFBFBD>n<EFBFBD>𤤧R<F0A4A4A7><52><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
void show(char); /* <20>L<EFBFBD>X<EFBFBD><58><EFBFBD>Ʃ<EFBFBD><C6A9>ù<EFBFBD> */
void adjust_u(int [], int); /* <20>q<EFBFBD>U<EFBFBD>ӤW<D3A4>վ<EFBFBD><D5BE><EFBFBD><EFBFBD><EFBFBD> */
void adjust_d(int [], int, int); /* <20>q<EFBFBD>W<EFBFBD>ӤU<D3A4>վ<EFBFBD><D5BE><EFBFBD><EFBFBD><EFBFBD> */
void exchange(int *, int *); /* <20><EFBFBD><E6B4AB><EFBFBD><EFBFBD> */
int search(int); /* <20>j<EFBFBD>M<EFBFBD><4D><EFBFBD><EFBFBD> */
void flushBuffer(void);
int heap_tree[MAX]; /* <20><><EFBFBD>n<EFBFBD><6E><EFBFBD>}<7D>C */
int last_index = 0; /* <20>̫<EFBFBD><CCAB>@<40><><EFBFBD><EFBFBD><EFBFBD>ƪ<EFBFBD>INDEX */
int main(void)
{
char option;
do {
printf("\n ******************\n");
printf(" <1> login\n");
printf(" <2> logout\n");
printf(" <3> show\n");
printf(" <4> quit\n");
printf(" ******************\n");
printf(" Enter your choice: ");
option = getchar();
flushBuffer();
printf("\n");
switch(option) {
case '1':
insert_f();
break;
case '2':
delete_f();
break;
case '3':
display_f();
break;
case '4':
exit(0);
default :
puts("<22><EFBFBD><EFB6B5><EFBFBD>~!");
}
} while(option != '4');
return 0;
}
void insert_f(void)
{
int id_temp;
if (last_index >= MAX) { /* <20><><EFBFBD>ƼƶW<C6B6>L<EFBFBD>W<EFBFBD><57><EFBFBD>A<EFBFBD><41><EFBFBD>ܿ<EFBFBD><DCBF>~<7E>T<EFBFBD><54> */
printf("\n Login members are more than %d!!\n", MAX);
printf(" Please wait for a minute!!\n");
}
else {
printf("\n Enter login ID number: ");
scanf("%d", &id_temp);
flushBuffer();
create(id_temp); /* <20>إ߰<D8A5><DFB0>n */
printf(" Login successfully!!\n");
}
}
void delete_f(void)
{
int id_temp, del_index;
if (last_index < 1) { /* <20>L<EFBFBD><4C><EFBFBD>Ʀs<C6A6>b<EFBFBD>A<EFBFBD><41><EFBFBD>ܿ<EFBFBD><DCBF>~<7E>T<EFBFBD><54> */
printf("\n No member to logout!!\n");
printf(" Please check again!!\n");
}
else {
printf("\n Enter logout ID number: ");
scanf("%d", &id_temp);
flushBuffer();
del_index = search(id_temp); /* <20>M<EFBFBD><4D><EFBFBD><EFBFBD><EFBFBD>R<EFBFBD><52><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
if (del_index == 0) /* <20>S<EFBFBD><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ơA<C6A1><41><EFBFBD>ܿ<EFBFBD><DCBF>~<7E>T<EFBFBD><54> */
printf(" %d not found!!\n", id_temp);
else {
removes(del_index); /* <20>R<EFBFBD><52><EFBFBD><EFBFBD><EFBFBD>ơA<C6A1>ýվ<C3BD><D5BE><EFBFBD><EFBFBD>n<EFBFBD><6E> */
printf(" %d is logout!!\n", id_temp);
}
}
}
void display_f(void)
{
char option;
if (last_index < 1) /* <20>L<EFBFBD><4C><EFBFBD>Ʀs<C6A6>b<EFBFBD>A<EFBFBD><41><EFBFBD>ܿ<EFBFBD><DCBF>~<7E>T<EFBFBD><54> */
printf("\n <20><><EFBFBD>n<EFBFBD><6E><EFBFBD>L<EFBFBD><4C><EFBFBD><EFBFBD>!\n");
else {
printf("\n ****************\n");
printf(" <1> increase\n"); /* <20><><EFBFBD>ܲĤ@<40><><EFBFBD><EFBFBD><EFBFBD>Ѥp<D1A4><70><EFBFBD>j<EFBFBD>ƦC */
printf(" <2> decrease\n"); /* <20><><EFBFBD>ܲĤG<C4A4><47><EFBFBD><EFBFBD><EFBFBD>Ѥj<D1A4><6A><EFBFBD>p<EFBFBD>ƦC */
printf(" ******************\n");
do {
printf(" <20>п<EFBFBD><D0BF><EFBFBD>: ");
option = getchar();
flushBuffer();
printf("\n");
} while(option != '1' && option != '2');
show(option);
}
}
void create(int id_temp) /* ID_TEMP<4D><50><EFBFBD>s<EFBFBD>W<EFBFBD><57><EFBFBD><EFBFBD> */
{
heap_tree[++last_index] = id_temp; /* <20>N<EFBFBD><4E><EFBFBD>Ʒs<C6B7>W<EFBFBD><57><EFBFBD>̫<EFBFBD> */
adjust_u(heap_tree, last_index); /* <20>վ<EFBFBD><D5BE>s<EFBFBD>W<EFBFBD><57><EFBFBD><EFBFBD> */
}
void removes(int index_temp) /* INDEX_TEMP<4D><50><EFBFBD><EFBFBD><EFBFBD>R<EFBFBD><52><EFBFBD><EFBFBD><EFBFBD>Ƥ<EFBFBD>INDEX */
{ /* <20>H<EFBFBD>̫<EFBFBD><CCAB>@<40><><EFBFBD><EFBFBD><EFBFBD>ƥN<C6A5><4E><EFBFBD>R<EFBFBD><52><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
heap_tree[index_temp] = heap_tree[last_index];
heap_tree[last_index--] = 0;
if (last_index > 1) { /* <20><><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>Ƥj<C6A4><6A>1<EFBFBD><31><EFBFBD>A<EFBFBD>h<EFBFBD><68><EFBFBD>վ<EFBFBD> */
/* <20><><EFBFBD><EFBFBD><EFBFBD>N<EFBFBD><4E><EFBFBD>Ƥj<C6A4><6A><EFBFBD><EFBFBD>PARENT NODE<44>A<EFBFBD>h<EFBFBD><68><EFBFBD>W<EFBFBD>վ<EFBFBD> */
if(heap_tree[index_temp] > heap_tree[index_temp / 2] && index_temp > 1)
adjust_u(heap_tree, index_temp);
else /* <20><><EFBFBD>N<EFBFBD><4E><EFBFBD>Ƥp<C6A4><70><EFBFBD><EFBFBD>CHILDEN NODE<44>A<EFBFBD>h<EFBFBD><68><EFBFBD>U<EFBFBD>վ<EFBFBD> */
adjust_d(heap_tree, index_temp, last_index-1);
}
}
void show(char op)
{
int heap_temp[MAX+1];
int c_index;
/* <20>N<EFBFBD><4E><EFBFBD>n<EFBFBD><6E><EFBFBD><EFBFBD><EFBFBD>ƽƻs<C6BB><73><EFBFBD>t<EFBFBD>@<40>Ӱ}<7D>C<EFBFBD>@<40>ƧǤu<C7A4>@ */
for (c_index = 1; c_index <= last_index; c_index++)
heap_temp[c_index] = heap_tree[c_index];
/* <20>N<EFBFBD>}<7D>C<EFBFBD>վ㬰<D5BE>Ѥp<D1A4><70><EFBFBD>j<EFBFBD>ƦC */
for (c_index = last_index-1; c_index > 0; c_index--) {
exchange(&heap_temp[1], &heap_temp[c_index+1]);
adjust_d(heap_temp, 1, c_index);
}
printf("\n ID number\n");
printf(" =====================\n");
/* <20><><EFBFBD>ܲĤ@<40>ؤ覡<D8A4><E8A6A1><EFBFBD>X<EFBFBD>A<EFBFBD>H<EFBFBD><48><EFBFBD>W<EFBFBD><EFBFBD><E8A6A1><EFBFBD>X--<2D>ϥΰ<CFA5><CEB0>|
<20><><EFBFBD>ܲĤG<C4A4>ؤ覡<D8A4><E8A6A1><EFBFBD>X<EFBFBD>A<EFBFBD>H<EFBFBD><48><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8A6A1><EFBFBD>X--<2D>ϥΦ<CFA5><CEA6>C */
switch(op) {
case '1':
for(c_index = 1; c_index <= last_index; c_index++)
printf("%14d\n", heap_temp[c_index]);
break;
case '2':
for(c_index = last_index; c_index > 0; c_index--)
printf("%14d\n", heap_temp[c_index]);
break;
}
printf(" =====================\n");
printf(" Total member: %d\n", last_index);
}
void adjust_u(int temp[], int index) /* INDEX<45><58><EFBFBD>ثe<D8AB><65><EFBFBD>Ʀb<C6A6>}<7D>C<EFBFBD><43>INDEX */
{
while (index > 1) { /* <20>N<EFBFBD><4E><EFBFBD>Ʃ<EFBFBD><C6A9>W<EFBFBD>վ<EFBFBD><D5BE>ܮڬ<DCAE><DAAC><EFBFBD> */
if(temp[index] <= temp[index/2]) /* <20><><EFBFBD>ƽվ㧹<D5BE><E3A7B9><EFBFBD>N<EFBFBD><4E><EFBFBD>X<EFBFBD>A<EFBFBD>_<EFBFBD>h<EFBFBD><EFBFBD><E6B4AB><EFBFBD><EFBFBD> */
break;
else
exchange(&temp[index], &temp[index/2]);
index /= 2;
}
}
/* INDEX1<58><31><EFBFBD>ثe<D8AB><65><EFBFBD>Ʀb<C6A6>}<7D>C<EFBFBD><43>INDEX<45>AINDEX2<58><32><EFBFBD>̫<EFBFBD><CCAB>@<40><><EFBFBD><EFBFBD><EFBFBD>Ʀb<C6A6>}<7D>C<EFBFBD><43>INDEX */
void adjust_d(int temp[], int index1, int index2)
{ /* ID_TEMP<4D>O<EFBFBD><4F><EFBFBD>ثe<D8AB><65><EFBFBD>ơAINDEX_TEMP<4D>h<EFBFBD>O<EFBFBD>ثe<D8AB><65><EFBFBD>Ƥ<EFBFBD>CHILDEN NODE<44><45>INDEX */
int id_temp, index_temp;
id_temp = temp[index1];
index_temp = index1 * 2;
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƥ<EFBFBD>INDEX<45><58><EFBFBD>j<EFBFBD><6A><EFBFBD>̫<EFBFBD><CCAB>@<40><><EFBFBD><EFBFBD><EFBFBD>Ƥ<EFBFBD>INDEX<45>A<EFBFBD>h<EFBFBD>~<7E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
while (index_temp <= index2) {
if ((index_temp < index2) && (temp[index_temp] <
temp[index_temp+1]))
index_temp++; /* INDEX_TEMP<4D>O<EFBFBD><4F><EFBFBD>ثe<D8AB><65><EFBFBD>Ƥ<EFBFBD>CHILDEN NODE<44><45><EFBFBD><EFBFBD><EFBFBD>j<EFBFBD><6A> */
if (id_temp >= temp[index_temp]) /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>h<EFBFBD><68><EFBFBD>X<EFBFBD>A<EFBFBD>_<EFBFBD>h<EFBFBD><EFBFBD><E6B4AB><EFBFBD><EFBFBD> */
break;
else {
temp[index_temp/2] = temp[index_temp];
index_temp *= 2;
}
}
temp[index_temp/2] = id_temp;
}
/* <20><EFBFBD>ǨӤ<C7A8> ID1 <20><> ID2 <20>x<EFBFBD>s<EFBFBD><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
void exchange(int *id1, int *id2)
{
int id_temp;
id_temp = *id1;
*id1 = *id2;
*id2 = id_temp;
}
int search(int id_temp) /* <20>M<EFBFBD><4D><EFBFBD>}<7D>C<EFBFBD><43>ID_TEMP<4D>Ҧb */
{
int c_index;
for (c_index = 1; c_index <= MAX; c_index++)
if (id_temp == heap_tree[c_index])
return c_index; /* <20><><EFBFBD><EFBFBD><EFBFBD>h<EFBFBD>^<5E>Ǹ<EFBFBD><C7B8>Ʀb<C6A6>}<7D>C<EFBFBD><43><EFBFBD><EFBFBD>INDEX */
return 0; /* <20>S<EFBFBD><53><EFBFBD><EFBFBD><EFBFBD>h<EFBFBD>^<5E><>0 */
}
/* <20>M<EFBFBD>Žw<C5BD>İ<EFBFBD> */
void flushBuffer()
{
while (getchar() != '\n')
continue;
}