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

Đề tài: Cách cấp phát động trên C như thế nào?

  1. #1
    Ngày gia nhập
    09 2008
    Bài viết
    7

    Mặc định Cách cấp phát động trên C như thế nào?

    mình viết chương trình duyệt cây như thế này nhưng khi chạy nó cứ báo lỗi "the memory could not be read"
    vậy là sai ở phần cấp phát động.bạn nào giúp mình cách cấp phát đông trong code này với.. Đề bài là tạo và duyệt 1 cây tổng quát..
    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    #include <alloc.h>
    #include<assert.h>
    #define TRUE 1
    #define FALSE 0
    #define max 10
    struct nodetype
     {
       int info;
       int snut;
       struct nodetype *data[max];
       };
       typedef struct nodetype *Tree;
       Tree T,p;
        int empty(Tree T)
    {
       return(T == NULL ? TRUE : FALSE);
    }
     void taonutgoc(){
     	 int a,b,c;
            if(!empty(T)) printf("cay da co nut goc");
            else{
     		  printf("nhap gia tri nut goc");scanf("%d",&a);
     		  T=(Tree) malloc(sizeof(nodetype));
              T->info=a;
              T->snut=0;
            for(int i=0;i<max;i++)
              T->data[i]=NULL; 
    		 }
               };
       int search(Tree T1,int k){
           int i,found=0;
         
        if(T1->info=k) {found=1; p=T1;}
    	   if(T1){
    	   	  	i=T1->snut;
           for(i=0;i<=T1->snut;i++){
    	       search(T1->data[i],k);
    	        if(T1->info==k){   found=i;
    	               			   p=T1;
    							   break; 
    							        }
    	               	       
    			 }
    	   }
                      
          return (found);
           }
      void themnut(){
            int a,b,c,d;
            Tree s,T2;
            T2=T;
             printf("nhap 1 gia tri nut can them:");scanf("%d",&a);
           	    b=search(T2,a);
    		if(b) printf("Khoa bi trung,ko them dc");
    		else{
    		  printf("nhap khoa cua nut cha");scanf("%d",&c);
    		   T2=T;
    		   b=search(T2,c);
    		   if(b==0) printf("khong tim thay nut cha");
    		   else {
    		   	
    		   	s=(Tree) malloc(sizeof(nodetype));
    		   	   s->info=a;
    		       p->snut++;
       			   p->data[p->snut-1]=s;  
    			   
    		        }
    		
    		   }
      }
      void duyetcay(Tree T1){
             int i;
             
             if(T1==NULL) return;
             else
                 printf("%d",T1->info);
                   for(i=0;i<=T1->snut;i++){
    	              duyetcay(T1->data[i]);
               }
                 }
       void xoacay(Tree T1){
    	    int i;
    			 for(i=0;i<=T1->snut;i++){
    	              xoacay(T1->data[i]);
    	                free(T1);
    	         }  }
    			        
       void main(){
         int chucnang;
          do
       {
          // menu chinh cua chuong trinh
          printf("\n\nCAY TONG QUAT)");
          printf("\n\nCac chuc nang cua chuong trinh:\n");
          printf("   1: Them nut goc\n");
          printf("   2: Them nut con\n");
          printf("   3: Duyet cay \n");
          printf("   4: xoa toan bo cay \n");
          printf("   0: Ket thuc chuong trinh\n");
          printf("Chuc nang ban chon: ");
          scanf("%d", &chucnang);
          switch(chucnang)
          {
    	      case 1:   { taonutgoc();
    		              break;}  
              case 2: {
    		      themnut();
    		      break;
    		  } 
    		  case 3 :{
    		   duyetcay(T);
    		   break;
    		  }  
    		  case 4:{
    		        xoacay(T);break;
    				}
           }    
    	     }  while(chucnang!=0) ;
       }
    Đã được chỉnh sửa lần cuối bởi ahappyboy89 : 24-05-2009 lúc 11:31 AM.

  2. #2
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    lỗi sai nguy hiểm:

    C Code:
    1. typedef struct nodetype *Tree; (1)
    2. struct nodetype
    3.  {
    4.    int info;
    5.    int snut;
    6.    struct nodetype *data[max];
    7.    };
    8.    Tree T,p; (2)
    9.    void khoitao(){
    10.      //  p=(Tree) malloc(sizeof(nodetype));
    11.    
    12.                       }
    13.    int empty(Tree T) (3)
    14. {
    15.    return(T == NULL ? TRUE : FALSE); (4)
    16. }

    (1):
    * chưa có struct mà đã khai báo typedef, lỗi program flow.
    * typedef kiểu con trỏ nhưng khi dùng lại lẫn lộn
    sửa tạm thế này:
    C Code:
    1. struct nodetype
    2. {
    3.    int info;
    4.    int snut;
    5.    struct nodetype *data[max];
    6. };
    7. typedef struct nodetype  Tree;
    8. typedef struct nodetype* TreePtr;

    (2) T là khai báo global nhưng lại bị lẫn vô trong (3) gây confusion
    (2) T chưa được cấp phát bộ nhớ

    cấp phát thế này:
    C Code:
    1. T = ( Tree* ) calloc(1, sizeof( Tree ) );  (*)
    2. hoặc
    3. T = ( Tree* ) malloc( sizeof( Tree ) ); (**)

    điểm khác nhau giữa 2 cách cấp phát là:
    (*) vừa cấp phát vừa khởi tạo tất cả các giá trị thành phần về 0.
    (**) cấp phát, không khởi tạo.
    <vào cpluscplus.com để xem thêm>

    Trong kiểu liên kết của cậu, bên trong đều có nút con liên kết, bắt buộc phải khởi tạo trước khi sử dụng nếu không sẽ crash
    None!

  3. #3
    Ngày gia nhập
    09 2008
    Bài viết
    7

    Thank bạn mình đã sữa lại 1 số chổ trong code.Code chạy bình thường riêng khi vào đên hàm search thì lại báo lỗi "the memory could not be read" bạn có thể giúp mình chỉnh hàm search được ko.Hàm có nhiệm vụ trả về con trỏ p đang trỏ đến nó và trả về vị trị của nó trong mảng cỏn của nút cha

  4. #4
    Ngày gia nhập
    06 2007
    Nơi ở
    C:\WINDOWS\system32\dllcache\
    Bài viết
    3,006

    ko giúp được gì nhiều, tặng bạn bài này, phân tích khá chi tiết và dễ hiểu về danh sách liên kết, do định dạng pdf nên đành phải đính kèm file
    Attached Files Attached Files
    ^_,^

    Tổng hợp các câu chuyện hài hước vui nhộn, sử dụng Speech Synthesis để đọc : https://www.youtube.com/channel/UCLk...Tjrg/playlists


    Bùi Tấn Quang

  5. #5
    Ngày gia nhập
    08 2008
    Nơi ở
    ha noi
    Bài viết
    79

    ~,~ đây là báo cáo cái bài link list của ka đây mà ~,~
    u never know

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

  1. undo/redo khi thao tác với CSDL trên Winform C# làm thế nào?
    Gửi bởi cchangkhongayngo trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 9
    Bài viết cuối: 08-11-2012, 11:04 PM
  2. Làm Chữ chạy trên form C# như thẻ <marquee> trong HTML thế nào?
    Gửi bởi magnet241 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 6
    Bài viết cuối: 05-04-2012, 11:55 AM
  3. Trả lời: 30
    Bài viết cuối: 15-02-2012, 07:03 PM
  4. Lỗi gì đó liên quan tới DOS ảo trên win, không tìm thấy thông tin trên GOOGLE
    Gửi bởi longtth trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 3
    Bài viết cuối: 20-12-2009, 12:03 AM
  5. Lưu dữ liệu để trống trên một cell của datagirdview trên csdl Access như thế nào?
    Gửi bởi hvcuongit trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 2
    Bài viết cuối: 27-05-2009, 04:21 PM

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