A. Yêu cầu bài tập:
Thiết kế và cài đặt từ điển bằng bảng băm , khối lượng khoảng 1000 từ có các chức năng tra cứu , thêm , loại 1 từ trên từ điển đó.

B. Ý tưởng thực hiện chương trình:
1. chương trình thực hiện việc cài đặt 1 từ điển Anh – Việt bằng bảng băm
2. chương trình được viết bằng ngôn ngữ C/C++.
3. chương trình sử dụng giao diện Console ( màn hình DOS)
4. dữ liệu của chương trình được lưu trữ bằng các file văn bản có phần mở rộng *.txt
5. chương trình có các chức năng sau:
- xem từ điển theo các mục từ
+ chỉ xem từ
+ xem cả từ và nghĩa
- tra cứu từ điển : tìm xem 1 từ có ở trong từ điển hay không, nếu có
xuất từ và nghĩa ra màn hình.
- thêm 1 từ vào từ điển.
-xóa 1 từ ra khỏi từ điển.
-thay đổi nghĩa của 1 từ.
6. chương trình phải bảo đảm tính đóng gói dữ liệu : nghĩa là tính đóng đối với thay đổi( xóa, sửa ) và mở với bổ sung.
(EM ko biết cách post code vào, THẦY ƠI? EM CODE KO LỖIMÀ NÓ KO CHẠY, THẦY GIÚP EM)

Code:

[#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#define M 26  // so Buckets
#define TenFile "E:\\CTDL\\TU_DIEN.txt"
void DocFile(int **A, int &n)
{
   
   FILE*f=fopen(TenFile, "rb");
   fscanf(f, "%d", &n);
}
// dinh nghia cau truc tu dien
typedef struct TuDien 
{
    char tu[12];
    char nghia[100];
};

// dinh nghia cau truc nut cua buckets
typedef struct node
{
    TuDien key;
    struct node *next;
} Nodetype;

//dinh nghia nut con tro kieu Nodetype
typedef Nodetype *Nodeptr;

//mang con tro Bucket gom M bucket
Nodeptr Bucket[M];

//   khoi tao bang bam
void Initialize()
{
    for(int i=0;i<M;i++)
        Bucket[i]=NULL;
}

//hàm bam
int HashFunc(char c)
{
    if (c>=97) c=c-32;
    return (c%65);
}

//hàm này de tao nút có chua khóa k,tra ve kieu con tro Nodeptr
Nodeptr MakeNode(TuDien k)
{
    Nodeptr p;
    p=(Nodeptr) malloc(sizeof(Nodetype));
    p->key=k;
    p->next=NULL;
    return p;
}

// hàm này dùng de chèn tu vào Bucket, sau dó sap xep theo thu tu tang
void  InsertListOrder(Nodeptr &Head,Nodeptr G)
{
    Nodeptr  P, Q;
    P = Head;
    while (P != NULL)
    {
        if (strcmp(P->key.tu,G->key.tu)>0) break;
        Q = P;
        P = Q->next;
    }
    if (P == Head)
    {
        G->next = Head;
        Head = G;
    }
    else
    {
        G->next = Q->next;
        Q->next = G;
    }
}


//hàm này dùng de chèn khóa k vào Bucket th? b
void Place(int b,TuDien k)
{
    Nodeptr p,t;
    p=Bucket[b];
    t=MakeNode(k);
    if (p==NULL) Bucket[b]=t;
    else InsertListOrder(Bucket[b],t);
}
//hàm này dùng d? chèn khóa k vào b?ng bam
void Insert(TuDien k)
{
    int b=HashFunc(k.tu[0]);
    Place(b,k);
}

//duy?t Bucket
void TraverseBucket(int b)
{
    Nodeptr p;
    p=Bucket[b];
    while (p!=NULL)
    {
        printf("%3s,",p->key.tu);
        p=p->next;
    }
}
//duy?t toàn b? b?ng bam
void Traverse()
{
    for(int b=0;b<M;b++)
    {
        printf("\nBucket[%d]:",b);
        TraverseBucket(b);
    }
}

//hàm này dùng d? tra nghia c?a 1 t? trong t? di?n
void TraNghia(char *s)
{
    int b=HashFunc(s[0]);
    Nodeptr p = Bucket[b];
    while (p!=NULL && strcmp(p->key.tu,s)!=0)
        p=p->next;
    if (p==NULL) printf("\n\nKhong tim thay \"%s\" trong tu dien",s);
    else
        printf("\n\nNghia cua tu \"%s\":%s",s,p->key.nghia);
}

//hàm này dùng d? c?p nh?t nghia cho 1 t?
void CapNhatTu(char *s,char *s1)
{
    fflush(stdin);
    int b= HashFunc(s[0]);
    Nodeptr p=Bucket[b];
    while (p!=NULL && strcmp(p->key.tu,s)!=0)
        p=p->next;
    if (p==NULL) printf("\n\nKhong tim thay \"%s\" trong tu dien",s);
    else
    {
        strcat(p->key.nghia,",");
        strcat(p->key.nghia,s1);
    }
}

void Pop(Nodeptr &p)    // lay phan tu dau xau
{
    TuDien k;
    Nodeptr q;
    q=p;
    p=p->next;
    q->next=NULL;
    k=q->key;
    free(q);
}

void DelAfter(Nodeptr &q)  //xoa nut sau q
{
    Nodeptr p;
    p=q->next;
    q->next=p->next;
    p->next=NULL;
    free(p);
}

//xóa 1 t? trong t? di?n
void XoaTu(char *s)
{
    int b=HashFunc(s[0]);
    Nodeptr p,q;
    p=Bucket[b];
    while (p!=NULL && strcmp(p->key.tu,s)!=0)
    {
        q=p;
        p=p->next;
    }
    if (p==NULL) printf("\n\nKhong tim thay \"%s\" trong tu dien",s);
    if (p==Bucket[b]) Pop(Bucket[b]);
    else DelAfter(q);
}

//menu c?a chuong trình
void MENU()
{
    printf("\n\n\t\t\t\tTU DIEN ANH-VIET");
    printf("\n\nCac chuc nang chinh cua tu dien:");
    printf("\n\n1.Them tu moi vao tu dien");
    printf("\n\n2.Xoa mot tu khoi tu dien");
    printf("\n\n3.Cap nhat tu");
    printf("\n\n4.Tra nghia cua tu");
    printf("\n\n0.Thoat khoi tu dien");
    printf("\n\nBan chon chuc nang nao:");
}

int main()
{

    char *s,*s1;
    TuDien td;
    int choice;
    Initialize();
    do
    {
        MENU();
        scanf("%d",&choice);
        switch(choice)
        {
            case 1:
                clrscr();
                printf("THEM TU MOI VAO TU DIEN");
                printf("\n\nNhap tu can them:");fflush(stdin);
                gets(td.tu);
                printf("\n\nNhap nghia cua tu \"%s\":",td.tu);
                fflush(stdin);
                gets(td.nghia);
                Insert(td);
                break;
            case 2:
                clrscr();
                printf("\n\nNhap tu can xoa:");fflush(stdin);
                gets(s);
                XoaTu(s);
                break;
            case 3:
                clrscr();
                printf("CAP NHAT NGHIA CUA TU");
                printf("\n\nNhap tu can cap nhat:");
                gets(s);
                printf("\n\nNhap nghia cap nhat cua \"%s\":");
                fflush(stdin);
                gets(s1);
                CapNhatTu(s,s1);
                break;
            case 4:
                clrscr();
                printf("TRA NGHIA CUA TU");
                printf("\n\nNhap tu can tra nghia:");fflush(stdin);
                gets(s);
                TraNghia(s);
                break;
        }
    } while (choice!=0);
    return 0;