220 lines
6.4 KiB
Plaintext
220 lines
6.4 KiB
Plaintext
|
/* 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;
|
|||
|
}
|