Từ 1 tới 2 trên tổng số 2 kết quả

Đề tài: Hàm tìm kiếm trên bảng băm, mong được giúp đỡ???

  1. #1
    Ngày gia nhập
    05 2009
    Bài viết
    3

    Wink Hàm tìm kiếm trên bảng băm, mong được giúp đỡ???

    mình cần giúp đỡ về việc sửa hàm tìm kiếm trên bảng băm sử dụng phương pháp nối kết trực tiếp sao cho sau khi tìm kiếm hàm trả về giá trị là vị trí chính xác của KEY cần tìm(số thứ tự của nó trong BUCKET đó).
    VD bài dưới đây cần sửa hàm tìm kiếm thế nào để có thể làm đc như vậy?
    -----------------------------------------------------------------
    PHP Code:
    #include<conio.h>
    #include<stdio.h>
    #include<alloc.h>
    #include<stdlib.h>
    #define TRUE 1
    #define FALSE 0
    #define M 10
    struct nodes
       
    {
       
    int key;
       
    struct nodes *next;
       };
    typedef struct nodes *PHNODE;
    PHNODE HASHTABLE[M];
    //mang cac con tro chi nut dau cua cac HASHTABLE
    //tac vu getnode()
    PHNODE getnode()
        {
        
    PHNODE p;
        
    p=(PHNODE)malloc(sizeof(struct nodes));
        return(
    p);
        }
    //tac vu freenode:huy nut da cap phat
     
    void freenode(PHNODE p)
       {
        
    free(p);
        }
    //ham bam
     
    int HF(int key)
       {
        return (
    key%M);
        }
    //khoi dong cac HASHTABLE
     
    void initHASHTABLE()
       {
        
    int b;
        for(
    b=0;b<M;b++)
         
    HASHTABLE[b]=NULL;
        }
    //tac vu emptyHASHTABLE:kiem tra buket b co rong hay k
     
    int emptyHASHTABLE (int b)
       {
        return(
    HASHTABLE[b]==NULL?TRUE:FALSE);
        }
    //tac vu empty: kiem tra bang bam co ranh k
    int empty()
      {
       
    int b;
       for(
    b=0;b<M;b++)
       if(
    HASHTABLE[b]!=NULL)
       return(
    FALSE);
       return(
    TRUE);
       }
    //tac vu push:them nut moi vao au HASHTABLE b
      
    void push(int b,int x)
       {
        
    PHNODE p;
        
    p=getnode();
        
    p->key=x;
        
    p->next=HASHTABLE[b];
        
    HASHTABLE[b]=p;
        }
    //tac vu pop:xoa nut o dau HASHTABLE b
     
    int pop(int b)
       {
        
    PHNODE p;
        
    int k;
     if (
    emptyHASHTABLE(b))
     {
     
    printf("\nHASHTABLE %d rong,k xoa nut dc",b);
     return(
    0);
     }
     
    p=HASHTABLE[b];//nut can xoa la nut dau buket b
     
    k=p->key//k:noi dung nut bi xoa
     
    HASHTABLE[b]=p->next;
     
    freenode(p);
     return(
    k);
     }
    //tac vu insafter :them nut moi vao HASHTABLE
     
    void insafter(PHNODE p,int k)
       {
        
    PHNODE q;

        if(
    p==NULL)
        
    printf("\nk them nut moi dc");
        else
         {
          
    q=getnode();
          
    q->key=k;
          
    q->next=p->next;
          
    p->next=q;
          }
        }
    // tac vu delafter: xoa nut trong HASHTABLE
     
    int delafter(PHNODE p)
      {
       
    PHNODE q;
       
    int k;
       if(
    p==NULL||p->next==NULL)
        {
         
    printf("\nk xoa nut dc");
         return(
    0);
         }
        
    q=p->next;//q chi nut can xoa
        
    k=q->key;//k la noi dung nut bi xoa
        
    p->next=q->next;
        
    freenode(q);
        return(
    k);
        }
    //tac vu place:tac vu nay chi su dung khi them nut vao HASHTABLE da co thu tu
      
    void place(int b,int k)
       {
       
    PHNODE p,q;//q la nut truoc,p la nut sau
       
    q=NULL;
       for(
    p=HASHTABLE[b];p!=NULL&&k>p->key;p=p->next)
         
    q=p;
         if(
    q==NULL//them nut vao dau buket
         
    push(b,k);
         else
          
    insafter(q,k);
         }
    //tac vu insert:them nut co khoa k vao bang bam
     
    void insert(int k)
      {
       
    int b;
       
    b=HF(k);
       
    place(b,k);//tac vu place cua danh sach lien ket
       
    }
    // tac vu remove:xoa nut co khoa k trong bang bam
     
    void remove(int k)
      {
       
    int b;
       
    PHNODE p,q;
       
    b=HF(k);
       
    p=HASHTABLE[b];
       
    q=p;
       while(
    p!=NULL&&p->key!=k)
         {
         
    q=p;
         
    p=p->next;
         }
         if(
    p==NULL)
         
    printf("\n k co nut co khoa %d",k);
         else
          if(
    p==HASHTABLE[b])
           
    pop(b);//tac vu pop cua danh sach lien ket
           
    else
        
    delafter(q);//tac vu delafter cua danh sach lien ket
          
    }
    // tac vu clearHASHTABLE:xoa tat ca cac nut trong HASHTABLE b
     
    void clearHASHTABLE(int b)
      {
       
    PHNODE p,q;//q la nut truoc;p la nut sau
       
    q=NULL;
       
    p=HASHTABLE[b];
       while(
    p!=NULL)
        {
         
    q=p;
         
    p=p->next;
         
    freenode(q);//khoi dong HASHTABLE b
         
    }
        }

    // tac vu traverseHASHTABLE: duyet HASHTALE b
     
    void traverseHASHTABLE(int b)
      {
       
    PHNODE p;
       
    p=HASHTABLE[b];
       while(
    p!=NULL)
        {
         
    printf("%3d",p->key);
         
    p=p->next;
         }
       }
    // tac vu traverse: duyet bang bam
     
    void traverse()
      {
       
    int b;
       for(
    b=0;b<M;b++)
        {
        
    printf("\nHASHTABLE%d: ",b);
        
    traverseHASHTABLE(b);
        }
      }
    //search:tim kiem mot nut trong bang bam, neu k thay tra ve -1,thay tra ve b
    int search(int k)
     {
     
    PHNODE p;
     
    int b;
     
    b=HF(k);


     
    p=HASHTABLE[b];
     while(
    k>p->key&&p!=NULL)
     
    p=p->next;
      if(
    p==NULL || k!=p->key)
     return -
    1;
     else
      return(
    b);
       }
    // chuong trinh chinh
     
    void main()
      {
       
    int b,p,key,i,j,n,chucnang;
       
    char c;
       
    clrscr();


       
    initHASHTABLE();//khoi dong M HASHTABLE cua bang bam
        
    do
         {
         
    //menu chinh cua chuong trinh
         
    printf("\ncac chuc nang chinh cua chuong trinh:\n");
         
    printf("\n1:them mot nut vao bang bam\n");
         
    printf("\n2:them ngau nhien nhieu nut vao bang bam\n");
         
    printf("\n3: xoa nut trong bang bam\n");
         
    printf("\n4:xoa toan bo bang bam\n");
         
    printf("\n5:xoa mot bucket\n");
         
    printf("\n6:duyet bang bam\n");
         
    printf("\n7:tim kiem tren bang bam\n");
         
    printf("\n0:ket thuc chuong trinh\n");
         
    printf("\n chuc nang ban chon:");
         
    scanf("%d",&chucnang);
         switch(
    chucnang)
           {
        case 
    1:
         {
          
    printf("\nTHEM MOT NUT VAO BANG BAM\n");
          
    printf("\nkhoa cua nut moi\n");
          
    scanf("%d",&key);
          
    insert(key);
          break;
         }
        case 
    2:
          {
           
    printf("\nTHEM NGAU NHIEN NHIEU NUT VAO BANG BAM\n");
           
    printf("\nban muon them bao nhieu nut");
           
    scanf("%d",&n);
           
    randomize();
           for(
    i=0;i<n;i++)
             {
             
    key=random(100);
             
    insert(key);
             }
             break;
           }
         case 
    3:
            {
            
    printf("\n XOA TREN BANG BAM\n");
            
    printf("\n khoa cua nut can xoa\n");
            
    scanf("%d",&key);
            
    remove(key);
            break;
            }
         case 
    4:
            {
             
    printf("\nXOA TOAN BO BANG BAM\n");
             
    printf("\n ban co chac chan c/k \n");
             
    c=getch();
             if(
    c=='c'||c=='C')
             
    initHASHTABLE();
             break;
             }
          case 
    5:
             {
              
    printf("\n XOA MOT BUCKET:\n");
              
    printf("\nnhap bucket ban muon xoa\n");
              
    scanf("%d",&b);
              if(
    emptyHASHTABLE(b))
            
    printf("\n bucket k co phan tu nao\n");
              else
               {
              while(
    emptyHASHTABLE(b)==0)
              
    pop(b);
            }
              break;
              }
          case 
    6:
             {
              
    printf("\nDUYET BANG BAM\n");
              
    traverse();
              break;
              }
           case 
    7:
              {
              
    printf("\nTIM KIEM TREN BANG BAM\n");
              
    printf("\nkhoa can tim:");
              
    scanf("%d",&key);
               
    b=search(key);
              if(
    b==-1)
               
    printf("\n k tim thay\n");
              else
              
    printf("\n tim thay trong bang HASHTABLE %d",b);
              break;
              }
          }
        }
          while(
    chucnang!=0);
          
    initHASHTABLE();//tao bang bam rong
          

    mong các bạn giúp đỡ.

  2. #2
    Ngày gia nhập
    05 2009
    Bài viết
    3

    hix, k ai giúp tui đc à

Các đề tài tương tự

  1. Lập trình C Hổng kiến thức trong C mong mọi người giúp đỡ
    Gửi bởi mynameistuan trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 15
    Bài viết cuối: 03-10-2013, 09:29 PM
  2. Bài tập C, Xây dựng menu 2 lớp trên C...mong các bậc tiền bối giúp đỡ
    Gửi bởi tungcris trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 3
    Bài viết cuối: 24-11-2011, 03:07 PM
  3. Đổi cơ số trên C, mong các bạn giúp đỡ?
    Gửi bởi ngocanh711 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 8
    Bài viết cuối: 31-12-2009, 10:17 PM
  4. Cài Đặt Từ Điển Dùng Bảng Băm trên C, giúp mình sửa lỗi!
    Gửi bởi dinhcoich trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 4
    Bài viết cuối: 10-05-2009, 04:02 PM
  5. Kiến thức và bài tập cơ bản về Borland C++, mong các bạn giúp?
    Gửi bởi muonhochoi trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 9
    Bài viết cuối: 06-05-2009, 10:47 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn