217 lines
4.8 KiB
Plaintext
217 lines
4.8 KiB
Plaintext
|
/* 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;
|
|||
|
}
|