Data_Structure/資料結構光碟檔/CH14/hashingTableUsingList.c.txt

217 lines
4.8 KiB
Plaintext
Raw Normal View History

2025-01-20 21:25:33 +08:00
/* file name: hashingTableUsingList.c */
/* <20><><EFBFBD><EFBFBD><EFBFBD>k : <20>ϥ<EFBFBD><CFA5><EFBFBD><ECB5B2><EFBFBD>C<EFBFBD>B<EFBFBD>z<EFBFBD>I<EFBFBD><49> */
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAX_NUM 100 /* <20>̤j<CCA4><6A><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD> */
#define PRIME 97 /* MAX_NUM<55><4D><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
/* <20>w<EFBFBD>q<EFBFBD><71><EFBFBD>Ƶ<EFBFBD><C6B5>c */
typedef struct Person {
long id;
char name[21];
struct Person *link;
} Student;
/* <20>إ<EFBFBD><D8A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>C */
Student *Hashtab[MAX_NUM], *current;
/*<2A><><EFBFBD>ƭ쫬<C6AD>ŧi*/
long hashfun(long);
void insert(void);
void del(void);
Student *search(Student *,Student *);
void query(void);
void show(void);
void flushBuffer(void);
int main()
{
char *menu_prompt =
"\n=== Hashing Table Program ==\n"
" 1. Insert\n"
" 2. Delete\n"
" 3. Show\n"
" 4. Search\n"
" 5. Quit\n"
" <20>п<EFBFBD><D0BF>J<EFBFBD>ﶵ: ";
char choice;
int i;
/* <20>_<EFBFBD>l<EFBFBD><6C><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>C<EFBFBD>A<EFBFBD>N<EFBFBD>U<EFBFBD><55><EFBFBD>C<EFBFBD><43><EFBFBD>V NULL */
for (i = 0; i< MAX_NUM; i++)
Hashtab[i] = NULL;
do {
printf("%s", menu_prompt);
choice = toupper(getchar());
flushBuffer();
printf("\n");
switch (choice) {
case '1':
insert();
break;
case '2':
del();
break;
case '3':
show();
break;
case '4':
query();
break;
case '5':
puts("Bye Bye ^_^");
break;
default:
puts("<22><><EFBFBD>~<7E>ﶵ!!");
}
} while (choice != '5');
return 0;
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: */
/* <20>H<EFBFBD><48><EFBFBD>k<EFBFBD>B<EFBFBD><42><EFBFBD>ǨD<C7A8>X<EFBFBD>O<EFBFBD><4F><EFBFBD><EFBFBD><EFBFBD>x<EFBFBD>s<EFBFBD><73><EFBFBD><EFBFBD><EFBFBD>} */
long hashfun(long key)
{
return (key % PRIME);
}
void insert()
{
Student *newnode;
long index;
/*<2A><><EFBFBD>J<EFBFBD>O<EFBFBD><4F>*/
newnode = (Student *)malloc(sizeof(Student));
newnode->link = NULL;
printf("Enter id: ");
scanf("%ld",&newnode->id);
printf("Enter Name: ");
scanf("%s",newnode->name);
flushBuffer();
/* <20>Q<EFBFBD><51><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƨD<C6A8>o<EFBFBD>O<EFBFBD><4F><EFBFBD><EFBFBD><EFBFBD>} */
index = hashfun(newnode->id);
printf("index <20><> %ld\n", index);
/* <20>P<EFBFBD>_<EFBFBD>Ӧ<EFBFBD><D3A6>C<EFBFBD>O<EFBFBD>_<EFBFBD><5F><EFBFBD>šA<C5A1>Y<EFBFBD><59><EFBFBD>ūh<C5AB>إߦ<D8A5><DFA6><EFBFBD><ECB5B2><EFBFBD>C */
if (Hashtab[index] == NULL) {
Hashtab[index] = newnode;
printf("Node insert ok!\n");
}
else {
printf("<22><><EFBFBD>I<EFBFBD><49><EFBFBD>A<EFBFBD>[<5B>J<EFBFBD><4A><EFBFBD>C<EFBFBD><43>...\n");
/* <20>[<5B>J<EFBFBD><4A><EFBFBD><EFBFBD><EFBFBD>C<EFBFBD><43> */
current = Hashtab[index];
while (current->link != NULL) {
current = current->link;
}
current->link = newnode;
}
}
/* <20>R<EFBFBD><52><EFBFBD>`<60>I<EFBFBD><49><EFBFBD><EFBFBD> */
void del()
{
Student *node ,*node_parent;
long index;
node = (Student *)malloc(sizeof(Student));
printf("Enter ID: ");
scanf("%ld",&node->id);
flushBuffer();
/* <20>Q<EFBFBD><51><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>O<EFBFBD><4F><EFBFBD><EFBFBD><EFBFBD>} */
index = hashfun(node->id);
/* <20>j<EFBFBD>M<EFBFBD>`<60>I<EFBFBD>O<EFBFBD>_<EFBFBD>s<EFBFBD>b<EFBFBD>öǦ^<5E><><EFBFBD>V<EFBFBD>Ӹ`<60>I<EFBFBD><49><EFBFBD><EFBFBD> */
node = search(Hashtab[index], node);
if (node == NULL)
printf("<22><><EFBFBD><EFBFBD><EFBFBD>Ƨ<C6A7><E4A4A3>...\n");
else {
/* <20>p<EFBFBD>`<60>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD>C<EFBFBD><43><EFBFBD>A<EFBFBD>h<EFBFBD>N<EFBFBD><4E><EFBFBD>C<EFBFBD><43><EFBFBD>VNULL
<20>_<EFBFBD>h<EFBFBD><68><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>`<60>I<EFBFBD>A<EFBFBD>ñN<C3B1><4E><EFBFBD>`<60>Ilink<6E>V<EFBFBD>`<60>I<EFBFBD><49><EFBFBD><EFBFBD> */
printf("ID : %ld Name : %s\n",node->id,node->name);
if (node == Hashtab[index])
Hashtab[index] = NULL;
else {
node_parent = Hashtab[index];
while (node_parent->link->id != node->id)
node_parent = node_parent->link;
node_parent->link = node->link;
}
free(node);
printf("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƥw<C6A4>R<EFBFBD><52>....\n");
}
}
/* <20>j<EFBFBD>M<EFBFBD>`<60>I<EFBFBD><49><EFBFBD><EFBFBD>
<20>p<EFBFBD><70><EFBFBD><EFBFBD><EFBFBD>`<60>I<EFBFBD>h<EFBFBD>Ǧ^<5E><><EFBFBD>V<EFBFBD>Ӹ`<60>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<20>_<EFBFBD>h<EFBFBD>Ǧ^NULL */
Student *search(Student *linklist, Student *Node)
{
Student *ptr = linklist;
if (ptr == NULL)
return NULL;
while (ptr->id != Node->id && ptr->link != NULL)
ptr = ptr->link;
if (ptr == NULL)
return NULL;
else
return ptr;
}
/*<2A>d<EFBFBD>߸`<60>I<EFBFBD><49><EFBFBD><EFBFBD>*/
void query()
{
Student *query_node;
long index;
query_node = (Student *)malloc(sizeof(Student));
printf("Enter ID: ");
scanf("%ld", &query_node->id);
flushBuffer();
index = hashfun(query_node->id);
/* <20>j<EFBFBD>M<EFBFBD>`<60>I */
query_node = search(Hashtab[index], query_node);
if (query_node == NULL)
printf("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>S<EFBFBD><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...\n");
else {
printf("ID: %ld Name: %s\n", query_node->id,query_node->name);
}
}
/* <20><><EFBFBD>ܸ`<60>I<EFBFBD><49><EFBFBD>ơA
<20>q<EFBFBD><71><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>C<EFBFBD>@<40>@<40>M<EFBFBD><4D><EFBFBD>O<EFBFBD>_<EFBFBD><5F><EFBFBD>`<60>I<EFBFBD>s<EFBFBD>b */
void show()
{
int i, flag=0;
Student *ptr;
puts("ID NAME");
puts("------------------------");
for ( i = 0; i < MAX_NUM; i++ ) {
if (Hashtab[i] != NULL){
flag = 1;
ptr = Hashtab[i];
/* <20><><EFBFBD>C<EFBFBD><EFBFBD>Y<EFBFBD>٦<EFBFBD><D9A6><EFBFBD><EFBFBD>ơA<C6A1>h<EFBFBD>N<EFBFBD><4E><EFBFBD><EFBFBD><EFBFBD>C<EFBFBD><43><EFBFBD>ܥX */
while (ptr) {
printf("%-5ld %15s\n",ptr->id,ptr->name);
ptr = ptr->link;
}
}
}
if (flag == 0)
printf("The Hashing table is empty !!!\n");
}
void flushBuffer()
{
while (getchar() != '\n')
continue;
}