#include #include #include #include #include #include int const a = 1; int const b = 0; int const p = 89; int const m = 15; int max = 0; int min = 0; int max_key = 0; int min_key = 0; typedef struct node{ int value; int square; float radical; struct node *next; struct node *early; }node; int search_number (int key){ int i; for (i = 0; i < m; i++){ if (i==(((a*key + b)% p)% m)){ return i; } } return -1; } void insert_node (int *A, int key){ int i = search_number (key); node *tmp = (node*) malloc(sizeof(node)); tmp->value = key; tmp->square = key*key; tmp->radical = sqrt((float)key); if (A[i] == 0){ A[i] = tmp; tmp->next = NULL; tmp->early = NULL; } else{ node *tmp2; tmp2 = A[i]; A[i] = tmp; tmp->next = tmp2; tmp2->early = tmp; } } void output_list (int *A, int key){ int j; j = search_number (key); if (!A[j]){ printf ("no elements"); } else{ node *iter = A[j]; while (iter != NULL){ printf ("Value: %d\n", iter->value); printf ("The square root of value: %f\n", iter->radical ); printf ("The square of value: %d\n", iter->square ); iter = iter->next; printf ("\n"); } } } int search_key (int *A, int key){ int i, find = -1; i = search_number (key); node *iter; iter = A[i]; while (iter){ if (iter->value == key) find = 1; iter = iter->next; } return find; } int delete_node (int *A, int key){ int i, done = -1; max = 0; max_key = 0; i = search_number (key); node *iter; iter = A[i]; iter->early = NULL; while (1){ if (iter->value == key){ done = 1; break; } iter = iter->next; } node *temporary; temporary = iter; if ((iter->early == NULL)&&(iter->next == NULL)){ //first element and last A[i] = NULL; free (temporary); return done; } if ((iter->early != NULL)&&(iter->next != NULL)){ //in the middle node *tmp; tmp = iter->next; iter->next->early = iter->early; iter->early->next = tmp; free (temporary); return done; } if ((iter->early == NULL)&&(iter->next != NULL)){ A[i] = iter->next; iter->next = NULL; free (temporary); return done; } if ((iter->early != NULL)&&(iter->next == NULL)){ iter->early->next = NULL; free (temporary); return done; } } void max_list (int *A){ node *iter; int i, count; for (i = 0; i < m; i++){ iter = A[i]; count = 0; if (iter != NULL){ while (1){ count ++; if (iter->next == NULL) break; iter = iter->next; } if (max < count){ max = count; max_key = iter->value; } } } } int main (void){ int count = 30; int number, key, key2, i; int *A[m]; for (i = 0; i < m; i++){ A[i] = NULL; } FILE *mf; printf ("opening file :"); mf = fopen ("C:\\Users\\Anna\\Documents\\ci\\hash.dat","r+"); if (mf == NULL) printf ("error\n"); else printf ("done\n"); for (i = 0; i < count; i++){ fscanf(mf, "%d %d", &number, &key); printf ("%d\n", key); // printf ("%d\n", j); insert_node (A, key); } printf ("\n"); int variety, search; int behavior = 1; while (behavior){ printf ("Choose what u want:\n1-Add data\n2-Search key \n3-Delete key\n4-Watch on minimal, maximal, average of list\n0-If you want stop this\n"); printf ("Your choice: "); scanf ("%d", &variety); switch (variety){ case 1: count++; printf ("Input key, what we want insert: "); scanf ("%d", &key); insert_node (A, key); printf ("let's see what lye in A if key = %d\n", key); output_list (A, key); break; case 2: printf ("Input key, which we search: "); scanf ("%d", &key); search = search_key (A, key); if (search == -1){ printf ("no this key in hash-table\n"); } else { printf ("U have this key in hash-table\n"); output_list (A, key); } break; case 3: printf ("Input key, which delete: "); scanf ("%d", &key2); search = search_key(A, key2); if (search == -1){ printf ("no this key in hash-table\n"); } else { int del; del = delete_node (A, key2); if (del == -1){ printf ("Error. This element wasn't deleted\n"); } else { count--; printf ("Good job. Element was deleted\n"); } } break; case 4: max_list (A); // min_list (A); printf ("Max lengh of list %d, this is for this key %d\n", max, max_key); printf ("Min lengh of list %d, this is for this key %d\n", min, min_key); float average; average = (float)count/(float)m; printf ("Average lengh of list %f\n", average); break; case 0: behavior = 0; break; default: printf("Wrong input\n" ); break; } } fclose (mf); printf ("file closed\n"); return 0; }