Announcement

Collapse
No announcement yet.

[cấu trúc dữ liệu và giải thuật] giúp em với

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • [cấu trúc dữ liệu và giải thuật] giúp em với

    PHP Code:
    #include"conio.h"
    #include"stdio.h"
    typedef struct tagnode
    {
        
    int info;
         
    struct tagnode *pNext;
    }
    node;
    typedef struct taglist
    {
        
    node *pHead;
        
    node *pTail;
    }list;
    void colist(list &l)
    {
        
    l.pHead=l.pTail=NULL;
    }
    nodeget(int x)
    {
        
    node *p;
        
    p=new node;
        if(
    p==NULL)return 0;
        else
        {
            
    p->info=x;
            
    p->pNext=NULL;
        }
    }
    void addhead(list &l,node *p)
    {
        if(
    l.pHead==NULL)
        {
            
    l.pHead=p;
            
    l.pTail=l.pHead;
        }
        else
        {
            
    p->pNext=l.pHead;
            
    l.pHead=p;
        }
    }
    void addtail(list &l,node *p)
    {
        if(
    l.pHead==NULL)
        {
            
    l.pHead=p;
            
    l.pHead=l.pTail;
        }
        else
        {
            
    l.pTail->pNext=p;
            
    l.pTail=p;
        }
    }
    void addafterq(list &l,node *q,node *p)
    {
        if(
    q!=NULL)
        {
            
    p->pNext=q->pNext;
            
    q->pNext=p;
        }
        if(
    l.pTail==q)
           
    addtail(l,p);
        else
        
    addhead(l,p);

    }
    void deletehead(list &l)
    {
        
    node *p;
        
    p=l.pHead;
        
    l.pHead=l.pHead->pNext;
        
    delete p;
    }
    void deletetail(list &l)
    {
        
    node *p,*q;
        
    p=l.pHead;
        while(
    p!=l.pTail)
        {
            
    q=p;
            
    p=p->pNext;
        }
        
    l.pTail=q;
        
    q->pNext=NULL;
        
    delete p;
    }
    nodetim(list l,int x)
    {
        
    node *p;
        
    p=l.pHead;
        do
        {
            if(
    p->info==x) return p;
            
    p=p->pNext;
        }
        while(
    p!=l.pTail);
    }
    void timx(list l,int x)
    {
        
    int i=0;
        
    node *p;
        
    p=l.pHead;
        do
        {
            if(
    p->info==xi++;
            
    p=p->pNext;
        }
        while(
    p!=l.pTail);
        if(
    i<=0)
        {
            
    printf(" khong tim thay");

        }
        else
        {
            
    printf("x nam trong danh sach");
        }
    }
    void hoandoi(int &a,int &b)
    {
        
    int c;
        
    c=a;
        
    a=b;
        
    b=c;
    }
    void sapxep(list &l)
    {
        
    node *p,*q;

        for(
    p=l.pHead;p!=NULL;p=p->pNext)
            for(
    q=p->pNext;q!=NULL;q=q->pNext)
                if(
    p->info>q->info)hoandoi(p->info,q->info);
    }
    void inds(list &l)
    {
        
    node *p;
        
    p=l.pHead;
        while(
    p!=NULL)
        {
            
    printf("%d   ",p->info);
            
    p=p->pNext;

        }
    }
    int main()
    {
        
    node *p,*s;
        
    int x,d;
        list 
    l;
        
    colist(l);
        do
        {
            
    printf("nhap x \n");
            
    scanf("%d",&x);
            if(
    x<0)break;
            
    p=get(x);
            
    addhead(l,p);
        }while(
    1);
        
    inds(l);
        
    printf("nhap x ban muon chen");
        
    scanf("%d",&x);
        
    printf("nhap q ban muon chen sau no");
        
    scanf("%d",&d);
        
    s=tim(l,d);
        
    addafterq(l,s,get(x));
        
    inds(l);
        
    printf("nhap x muon tim ");
        
    scanf("%d",&x);
        
    timx(l,x);
        
    sapxep(l);
        
    inds(l);
        
    getch();
        return 
    0;

    xem giúp em hàm addafterq nó chạy mãi không dừng hix

  • #2
    if(l.pTail==q)
    addtail(l,p);
    else
    addhead(l,p);
    bạn thử bỏ dấu ";" trong hàm addafterq xem sao?
    Name: Võ Hồng Phi
    MSSV: 10520198

    Comment


    • #3
      Originally posted by 11520158 View Post
      PHP Code:
      #include"conio.h"
      #include"stdio.h"
      typedef struct tagnode
      {
          
      int info;
           
      struct tagnode *pNext;
      }
      node;
      typedef struct taglist
      {
          
      node *pHead;
          
      node *pTail;
      }list;
      void colist(list &l)
      {
          
      l.pHead=l.pTail=NULL;
      }
      nodeget(int x)
      {
          
      node *p;
          
      p=new node;
          if(
      p==NULL)return 0;
          else
          {
              
      p->info=x;
              
      p->pNext=NULL;
          }
      }
      void addhead(list &l,node *p)
      {
          if(
      l.pHead==NULL)
          {
              
      l.pHead=p;
              
      l.pTail=l.pHead;
          }
          else
          {
              
      p->pNext=l.pHead;
              
      l.pHead=p;
          }
      }
      void addtail(list &l,node *p)
      {
          if(
      l.pHead==NULL)
          {
              
      l.pHead=p;
              
      l.pHead=l.pTail;
          }
          else
          {
              
      l.pTail->pNext=p;
              
      l.pTail=p;
          }
      }
      void addafterq(list &l,node *q,node *p)
      {
          if(
      q!=NULL)
          {
              
      p->pNext=q->pNext;
              
      q->pNext=p;
          }
          if(
      l.pTail==q)
             
      addtail(l,p);
          else
          
      addhead(l,p);

      }
      void deletehead(list &l)
      {
          
      node *p;
          
      p=l.pHead;
          
      l.pHead=l.pHead->pNext;
          
      delete p;
      }
      void deletetail(list &l)
      {
          
      node *p,*q;
          
      p=l.pHead;
          while(
      p!=l.pTail)
          {
              
      q=p;
              
      p=p->pNext;
          }
          
      l.pTail=q;
          
      q->pNext=NULL;
          
      delete p;
      }
      nodetim(list l,int x)
      {
          
      node *p;
          
      p=l.pHead;
          do
          {
              if(
      p->info==x) return p;
              
      p=p->pNext;
          }
          while(
      p!=l.pTail);
      }
      void timx(list l,int x)
      {
          
      int i=0;
          
      node *p;
          
      p=l.pHead;
          do
          {
              if(
      p->info==xi++;
              
      p=p->pNext;
          }
          while(
      p!=l.pTail);
          if(
      i<=0)
          {
              
      printf(" khong tim thay");

          }
          else
          {
              
      printf("x nam trong danh sach");
          }
      }
      void hoandoi(int &a,int &b)
      {
          
      int c;
          
      c=a;
          
      a=b;
          
      b=c;
      }
      void sapxep(list &l)
      {
          
      node *p,*q;

          for(
      p=l.pHead;p!=NULL;p=p->pNext)
              for(
      q=p->pNext;q!=NULL;q=q->pNext)
                  if(
      p->info>q->info)hoandoi(p->info,q->info);
      }
      void inds(list &l)
      {
          
      node *p;
          
      p=l.pHead;
          while(
      p!=NULL)
          {
              
      printf("%d   ",p->info);
              
      p=p->pNext;

          }
      }
      int main()
      {
          
      node *p,*s;
          
      int x,d;
          list 
      l;
          
      colist(l);
          do
          {
              
      printf("nhap x \n");
              
      scanf("%d",&x);
              if(
      x<0)break;
              
      p=get(x);
              
      addhead(l,p);
          }while(
      1);
          
      inds(l);
          
      printf("nhap x ban muon chen");
          
      scanf("%d",&x);
          
      printf("nhap q ban muon chen sau no");
          
      scanf("%d",&d);
          
      s=tim(l,d);
          
      addafterq(l,s,get(x));
          
      inds(l);
          
      printf("nhap x muon tim ");
          
      scanf("%d",&x);
          
      timx(l,x);
          
      sapxep(l);
          
      inds(l);
          
      getch();
          return 
      0;

      xem giúp em hàm addafterq nó chạy mãi không dừng hix
      hàm tạo Node*get(int ) bạn thiếu một chi tiết rất quan trọng là câu lệnh return p( mục đích chính thì lại quên). nếu p==NULL thì return NULL vì hàm này trả về địa chỉ.
      hàm tìm kiếm nên trả về NULL khi không tìm thấy
      hàm addafter của bạn viết sai 1 lỗi nhỏ là cái ngoặc nhọn đóng vị trí đúng là ngay trên else.
      good luck!
      Last edited by 11520327; 29-05-2012, 14:09.

      Comment


      • #4
        Originally posted by 11520158 View Post
        PHP Code:
        #include"conio.h"
        #include"stdio.h"
        typedef struct tagnode
        {
            
        int info;
             
        struct tagnode *pNext;
        }
        node;
        typedef struct taglist
        {
            
        node *pHead;
            
        node *pTail;
        }list;
        void colist(list &l)
        {
            
        l.pHead=l.pTail=NULL;
        }
        nodeget(int x)
        {
            
        node *p;
            
        p=new node;
            if(
        p==NULL)return 0;
            else
            {
                
        p->info=x;
                
        p->pNext=NULL;
            }
        }
        void addhead(list &l,node *p)
        {
            if(
        l.pHead==NULL)
            {
                
        l.pHead=p;
                
        l.pTail=l.pHead;
            }
            else
            {
                
        p->pNext=l.pHead;
                
        l.pHead=p;
            }
        }
        void addtail(list &l,node *p)
        {
            if(
        l.pHead==NULL)
            {
                
        l.pHead=p;
                
        l.pHead=l.pTail;
            }
            else
            {
                
        l.pTail->pNext=p;
                
        l.pTail=p;
            }
        }
        void addafterq(list &l,node *q,node *p)
        {
            if(
        q!=NULL)
            {
                
        p->pNext=q->pNext;
                
        q->pNext=p;
            }
            if(
        l.pTail==q)
               
        addtail(l,p);
            else
            
        addhead(l,p);

        }
        void deletehead(list &l)
        {
            
        node *p;
            
        p=l.pHead;
            
        l.pHead=l.pHead->pNext;
            
        delete p;
        }
        void deletetail(list &l)
        {
            
        node *p,*q;
            
        p=l.pHead;
            while(
        p!=l.pTail)
            {
                
        q=p;
                
        p=p->pNext;
            }
            
        l.pTail=q;
            
        q->pNext=NULL;
            
        delete p;
        }
        nodetim(list l,int x)
        {
            
        node *p;
            
        p=l.pHead;
            do
            {
                if(
        p->info==x) return p;
                
        p=p->pNext;
            }
            while(
        p!=l.pTail);
        }
        void timx(list l,int x)
        {
            
        int i=0;
            
        node *p;
            
        p=l.pHead;
            do
            {
                if(
        p->info==xi++;
                
        p=p->pNext;
            }
            while(
        p!=l.pTail);
            if(
        i<=0)
            {
                
        printf(" khong tim thay");

            }
            else
            {
                
        printf("x nam trong danh sach");
            }
        }
        void hoandoi(int &a,int &b)
        {
            
        int c;
            
        c=a;
            
        a=b;
            
        b=c;
        }
        void sapxep(list &l)
        {
            
        node *p,*q;

            for(
        p=l.pHead;p!=NULL;p=p->pNext)
                for(
        q=p->pNext;q!=NULL;q=q->pNext)
                    if(
        p->info>q->info)hoandoi(p->info,q->info);
        }
        void inds(list &l)
        {
            
        node *p;
            
        p=l.pHead;
            while(
        p!=NULL)
            {
                
        printf("%d   ",p->info);
                
        p=p->pNext;

            }
        }
        int main()
        {
            
        node *p,*s;
            
        int x,d;
            list 
        l;
            
        colist(l);
            do
            {
                
        printf("nhap x \n");
                
        scanf("%d",&x);
                if(
        x<0)break;
                
        p=get(x);
                
        addhead(l,p);
            }while(
        1);
            
        inds(l);
            
        printf("nhap x ban muon chen");
            
        scanf("%d",&x);
            
        printf("nhap q ban muon chen sau no");
            
        scanf("%d",&d);
            
        s=tim(l,d);
            
        addafterq(l,s,get(x));
            
        inds(l);
            
        printf("nhap x muon tim ");
            
        scanf("%d",&x);
            
        timx(l,x);
            
        sapxep(l);
            
        inds(l);
            
        getch();
            return 
        0;

        xem giúp em hàm addafterq nó chạy mãi không dừng hix

        có chút góp ý nho nhỏ. thứ nhất là bạn nên nói rõ trong hàm nhập là làm sao để thoát khỏi hàm nhập, nãy tui chạy cứ thấy hiện nhập x mà chả biết làm sao dừng.
        thứ hai là bạn nên để phần thân các hàm con dưới hàm main(), như vậy chương trình sẽ dễ đọc và tránh được một số lỗi( thứ tự hàm trước sau).
        thứ ba: khi khai báo thư viện đối với các thư viện có sẵn thì nên đặt trong hai dẫu <>( còn vì sao bạn tự tìm hiểu nha, có sự khác nhau giữa "" và <>).

        Comment


        • #5
          AddAfter(list &l, node *q, node *p)

          Quy ước :
          thêm nút p vào sau nút q trong list. Nếu q==NULL thì nghĩa là thêm vào đầu list.

          Code:
          void AddAfter(list &l,node *q,node *p)
          {
              if(q==NULL)
                  addhead(l,p);
              else
              {
                  //Gắn p vào list
                  p->pNext=q->pNext;
                  q->pNext=p;
          
                  //Nếu q là tail thì sau khi thêm, p sẽ là tail mới của list
                  if (q==l.pTail)
                      l.pTail = p;   
              }
          }

          Comment


          • #6
            Originally posted by 10520346 View Post
            AddAfter(list &l, node *q, node *p)

            Quy ước :
            thêm nút p vào sau nút q trong list. Nếu q==NULL thì nghĩa là thêm vào đầu list.

            Code:
            void AddAfter(list &l,node *q,node *p)
            {
                if(q==NULL)
                    addhead(l,p);
                else
                {
                    //Gắn p vào list
                    p->pNext=q->pNext;
                    q->pNext=p;
            
                    //Nếu q là tail thì sau khi thêm, p sẽ là tail mới của list
                    if (q==l.pTail)
                        l.pTail = p;   
                }
            }
            ý của anh là sao, code của em sai hay cần phải làm theo code của anh, nếu phải làm theo code cua anh thì cho em biết lý do nha thanks

            Comment


            • #7
              Originally posted by 11520158 View Post
              PHP Code:
              #include"conio.h"
              #include"stdio.h"
              typedef struct tagnode
              {
                  
              int info;
                   
              struct tagnode *pNext;
              }
              node;
              typedef struct taglist
              {
                  
              node *pHead;
                  
              node *pTail;
              }list;
              void colist(list &l)
              {
                  
              l.pHead=l.pTail=NULL;
              }
              nodeget(int x)
              {
                  
              node *p;
                  
              p=new node;
                  if(
              p==NULL)return 0;
                  else
                  {
                      
              p->info=x;
                      
              p->pNext=NULL;
                  }
              }
              void addhead(list &l,node *p)
              {
                  if(
              l.pHead==NULL)
                  {
                      
              l.pHead=p;
                      
              l.pTail=l.pHead;
                  }
                  else
                  {
                      
              p->pNext=l.pHead;
                      
              l.pHead=p;
                  }
              }
              void addtail(list &l,node *p)
              {
                  if(
              l.pHead==NULL)
                  {
                      
              l.pHead=p;
                      
              l.pHead=l.pTail;
                  }
                  else
                  {
                      
              l.pTail->pNext=p;
                      
              l.pTail=p;
                  }
              }
              void addafterq(list &l,node *q,node *p)
              {
                  if(
              q!=NULL)
                  {
                      
              p->pNext=q->pNext;
                      
              q->pNext=p;
                  }
                  if(
              l.pTail==q)
                     
              addtail(l,p);
                  else
                  
              addhead(l,p);

              }
              void deletehead(list &l)
              {
                  
              node *p;
                  
              p=l.pHead;
                  
              l.pHead=l.pHead->pNext;
                  
              delete p;
              }
              void deletetail(list &l)
              {
                  
              node *p,*q;
                  
              p=l.pHead;
                  while(
              p!=l.pTail)
                  {
                      
              q=p;
                      
              p=p->pNext;
                  }
                  
              l.pTail=q;
                  
              q->pNext=NULL;
                  
              delete p;
              }
              nodetim(list l,int x)
              {
                  
              node *p;
                  
              p=l.pHead;
                  do
                  {
                      if(
              p->info==x) return p;
                      
              p=p->pNext;
                  }
                  while(
              p!=l.pTail);
              }
              void timx(list l,int x)
              {
                  
              int i=0;
                  
              node *p;
                  
              p=l.pHead;
                  do
                  {
                      if(
              p->info==xi++;
                      
              p=p->pNext;
                  }
                  while(
              p!=l.pTail);
                  if(
              i<=0)
                  {
                      
              printf(" khong tim thay");

                  }
                  else
                  {
                      
              printf("x nam trong danh sach");
                  }
              }
              void hoandoi(int &a,int &b)
              {
                  
              int c;
                  
              c=a;
                  
              a=b;
                  
              b=c;
              }
              void sapxep(list &l)
              {
                  
              node *p,*q;

                  for(
              p=l.pHead;p!=NULL;p=p->pNext)
                      for(
              q=p->pNext;q!=NULL;q=q->pNext)
                          if(
              p->info>q->info)hoandoi(p->info,q->info);
              }
              void inds(list &l)
              {
                  
              node *p;
                  
              p=l.pHead;
                  while(
              p!=NULL)
                  {
                      
              printf("%d   ",p->info);
                      
              p=p->pNext;

                  }
              }
              int main()
              {
                  
              node *p,*s;
                  
              int x,d;
                  list 
              l;
                  
              colist(l);
                  do
                  {
                      
              printf("nhap x \n");
                      
              scanf("%d",&x);
                      if(
              x<0)break;
                      
              p=get(x);
                      
              addhead(l,p);
                  }while(
              1);
                  
              inds(l);
                  
              printf("nhap x ban muon chen");
                  
              scanf("%d",&x);
                  
              printf("nhap q ban muon chen sau no");
                  
              scanf("%d",&d);
                  
              s=tim(l,d);
                  
              addafterq(l,s,get(x));
                  
              inds(l);
                  
              printf("nhap x muon tim ");
                  
              scanf("%d",&x);
                  
              timx(l,x);
                  
              sapxep(l);
                  
              inds(l);
                  
              getch();
                  return 
              0;

              xem giúp em hàm addafterq nó chạy mãi không dừng hix
              cái sai ở hàm addafterq của bạn: khi giá trị q khác NULL thì đã thêm p vào danh sách
              if(q!=NULL)
              {
              p->pNext=q->pNext;
              q->pNext=p;
              }
              sau hàm trên p được nối vào danh sách. Giả sử q là nút cuối cùng nếu viết như trên thì sau khi thêm p vào sau q, l.ptail vẫn là q và tiếp tục xuống dưới lại thêm tiếp p vào sau q
              if(l.pTail==q)
              addtail(l,p);
              vậy là p được thêm 2 lần vào danh sách->danh sách có 2 nhánh.

              Comment


              • #8
                PHP Code:
                void themsauQ(DList &l,DNode *q,DNode *moi)
                {
                    if(
                q)
                    {
                        
                DNode *p=q->pNext;
                            
                moi->pNext=p;
                            
                moi->prew=q;
                            
                q->pNext=moi;
                        if(
                p==l.tail)
                            
                l.tail=moi;
                        else
                            
                p->prew=moi;
                    }

                good luck !

                Comment


                • #9
                  Originally posted by 11520327 View Post
                  hàm tạo Node*get(int ) bạn thiếu một chi tiết rất quan trọng là câu lệnh return p( mục đích chính thì lại quên). nếu p==NULL thì return NULL vì hàm này trả về địa chỉ.
                  hàm tìm kiếm nên trả về NULL khi không tìm thấy
                  hàm addafter của bạn viết sai 1 lỗi nhỏ là cái ngoặc nhọn đóng vị trí đúng là ngay trên else.
                  good luck!
                  -mình cảm ơn với những đóng góp của bạn lúc trước mình cũng viết theo dạng hàm main() ở trên như bạn nhưng mình thấy nó làm mất thời gian quá vì phải khai báo ở trên nữa.
                  -còn hàm get() không sai bạn nha, mình dùng code blocks không cần return bạn có thể kiểm tra lại
                  -thank tất cả mọi người nhờ mọi người mà em đã tìm được chổ sai rồi thanks

                  Comment


                  • #10
                    Originally posted by 11520158 View Post
                    -còn hàm get() không sai bạn nha, mình dùng code blocks không cần return bạn có thể kiểm tra lại
                    Nếu em dùng code::blocks thì làm sao lại có <conio.h> và getch(); được nhỉ. Dù sao đi nữa thì việc kết thúc hàm mà không có lệnh return nào được chạy là một làm không được định nghĩa trong chuẩn ("undefined behavior"). Mỗi trình biên dịch, mỗi hệ máy có thể sẽ cho các kết quả khác nhau.Visual studio sẽ phát sinh compile error. Sinh viên được khuyến cáo là không thử và không sử dụng các kiểu code này.

                    Comment


                    • #11
                      - lúc trước dùng c-free cần return, nhưng em cứ quên return hoài(đến đó là cứ quên hjx)
                      - em dùng code blocks 10.05 anh có thể kiểm tra đoạn code ở trên là em copy hoàn toàn từ máy mình không sửa gì hết
                      -em thấy các hàm khác cũng vậy không cần return cũng chạy không báo lổi giống như đoạn code ở tren em đã thêm return p và chạy rồi bỏ return p rồi chạy vẩn cùng 1 kết quả không biết code blocks làm gì nửa,
                      - anh nào hiểu rõ vấn đề này giải thích hộ em nha, thanks

                      Comment


                      • #12
                        Originally posted by 11520158 View Post
                        PHP Code:
                        #include"conio.h"
                        #include"stdio.h"
                        typedef struct tagnode
                        {
                            
                        int info;
                             
                        struct tagnode *pNext;
                        }
                        node;
                        typedef struct taglist
                        {
                            
                        node *pHead;
                            
                        node *pTail;
                        }list;
                        void colist(list &l)
                        {
                            
                        l.pHead=l.pTail=NULL;
                        }
                        nodeget(int x)
                        {
                            
                        node *p;
                            
                        p=new node;
                            if(
                        p==NULL)return 0;
                            else
                            {
                                
                        p->info=x;
                                
                        p->pNext=NULL;
                            }
                        }
                        void addhead(list &l,node *p)
                        {
                            if(
                        l.pHead==NULL)
                            {
                                
                        l.pHead=p;
                                
                        l.pTail=l.pHead;
                            }
                            else
                            {
                                
                        p->pNext=l.pHead;
                                
                        l.pHead=p;
                            }
                        }
                        void addtail(list &l,node *p)
                        {
                            if(
                        l.pHead==NULL)
                            {
                                
                        l.pHead=p;
                                
                        l.pHead=l.pTail;
                            }
                            else
                            {
                                
                        l.pTail->pNext=p;
                                
                        l.pTail=p;
                            }
                        }
                        void addafterq(list &l,node *q,node *p)
                        {
                            if(
                        q!=NULL)
                            {
                                
                        p->pNext=q->pNext;
                                
                        q->pNext=p;
                            }
                            if(
                        l.pTail==q)
                               
                        addtail(l,p);
                            else
                            
                        addhead(l,p);

                        }
                        void deletehead(list &l)
                        {
                            
                        node *p;
                            
                        p=l.pHead;
                            
                        l.pHead=l.pHead->pNext;
                            
                        delete p;
                        }
                        void deletetail(list &l)
                        {
                            
                        node *p,*q;
                            
                        p=l.pHead;
                            while(
                        p!=l.pTail)
                            {
                                
                        q=p;
                                
                        p=p->pNext;
                            }
                            
                        l.pTail=q;
                            
                        q->pNext=NULL;
                            
                        delete p;
                        }
                        nodetim(list l,int x)
                        {
                            
                        node *p;
                            
                        p=l.pHead;
                            do
                            {
                                if(
                        p->info==x) return p;
                                
                        p=p->pNext;
                            }
                            while(
                        p!=l.pTail);
                        }
                        void timx(list l,int x)
                        {
                            
                        int i=0;
                            
                        node *p;
                            
                        p=l.pHead;
                            do
                            {
                                if(
                        p->info==xi++;
                                
                        p=p->pNext;
                            }
                            while(
                        p!=l.pTail);
                            if(
                        i<=0)
                            {
                                
                        printf(" khong tim thay");

                            }
                            else
                            {
                                
                        printf("x nam trong danh sach");
                            }
                        }
                        void hoandoi(int &a,int &b)
                        {
                            
                        int c;
                            
                        c=a;
                            
                        a=b;
                            
                        b=c;
                        }
                        void sapxep(list &l)
                        {
                            
                        node *p,*q;

                            for(
                        p=l.pHead;p!=NULL;p=p->pNext)
                                for(
                        q=p->pNext;q!=NULL;q=q->pNext)
                                    if(
                        p->info>q->info)hoandoi(p->info,q->info);
                        }
                        void inds(list &l)
                        {
                            
                        node *p;
                            
                        p=l.pHead;
                            while(
                        p!=NULL)
                            {
                                
                        printf("%d   ",p->info);
                                
                        p=p->pNext;

                            }
                        }
                        int main()
                        {
                            
                        node *p,*s;
                            
                        int x,d;
                            list 
                        l;
                            
                        colist(l);
                            do
                            {
                                
                        printf("nhap x \n");
                                
                        scanf("%d",&x);
                                if(
                        x<0)break;
                                
                        p=get(x);
                                
                        addhead(l,p);
                            }while(
                        1);
                            
                        inds(l);
                            
                        printf("nhap x ban muon chen");
                            
                        scanf("%d",&x);
                            
                        printf("nhap q ban muon chen sau no");
                            
                        scanf("%d",&d);
                            
                        s=tim(l,d);
                            
                        addafterq(l,s,get(x));
                            
                        inds(l);
                            
                        printf("nhap x muon tim ");
                            
                        scanf("%d",&x);
                            
                        timx(l,x);
                            
                        sapxep(l);
                            
                        inds(l);
                            
                        getch();
                            return 
                        0;

                        xem giúp em hàm addafterq nó chạy mãi không dừng hix
                        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                        Tổng hợp lại tí:

                        Originally posted by 10520198 View Post
                        if(l.pTail==q)
                        addtail(l,p);
                        else
                        addhead(l,p);
                        bạn thử bỏ dấu ";" trong hàm addafterq xem sao?
                        Bỏ ";" chi vậy, bị lỗi ngay đó bạn.


                        Originally posted by 11520327 View Post
                        hàm tạo Node*get(int ) bạn thiếu một chi tiết rất quan trọng là câu lệnh return p( mục đích chính thì lại quên). nếu p==NULL thì return NULL vì hàm này trả về địa chỉ.
                        hàm tìm kiếm nên trả về NULL khi không tìm thấy
                        hàm addafter của bạn viết sai 1 lỗi nhỏ là cái ngoặc nhọn đóng vị trí đúng là ngay trên else.
                        good luck!
                        Đây có thể là nguyên nhân chính, hàm tạo nút không trả về con trỏ tới nút đó. Có thể sửa như trên.
                        Tuy nhiên khi p==NULL, nên là exit(1) luôn. Vì nếu khi tạo con trỏ bị NULL (tạo node không được do thiếu bộ nhớ gì đó nên con trỏ không trỏ vô đâu được) mà hàm mình lại trả lại NULL, khi đó người ta sẽ không rõ chuyện gì xảy ra, rồi lập trình sau đó gây ra lỗi mà không biết tại sao. Nói chung, chỉ có tạo ra sản phẩm tốt hoặc không tạo ra gì hết chứ không cố tạo ra sản phẩm xấu.
                        Ở đây đáng lẽ có thể dùng ngoại lệ, mà qua C# đi hả quan tâm nha.
                        Sữa thử:
                        PHP Code:
                        nodeget(int x

                            
                        node *= new node
                            if(!
                        p
                                return exit(
                        1); 
                            else 
                            { 
                                
                        p->info x
                                
                        p->pNext NULL;
                                return 
                        p
                            } 

                        Cũng có thể thay exit(1) = NULL , nhưng khi viết các hàm bên dưới phải có dự phòng thêm trường hợp tạo nút bị rỗng, hơi đuối đó.


                        Originally posted by 10520346 View Post
                        AddAfter(list &l, node *q, node *p)

                        Quy ước :
                        thêm nút p vào sau nút q trong list. Nếu q==NULL thì nghĩa là thêm vào đầu list.

                        Code:
                        void AddAfter(list &l,node *q,node *p)
                        {
                            if(q==NULL)
                                addhead(l,p);
                            else
                            {
                                //Gắn p vào list
                                p->pNext=q->pNext;
                                q->pNext=p;
                        
                                //Nếu q là tail thì sau khi thêm, p sẽ là tail mới của list
                                if (q==l.pTail)
                                    l.pTail = p;   
                            }
                        }
                        Hợp lí rồi đó bạn, LIKE.


                        Originally posted by 11520158 View Post
                        ý của anh là sao, code của em sai hay cần phải làm theo code của anh, nếu phải làm theo code cua anh thì cho em biết lý do nha thanks
                        Code của e sai về ngữ nghĩa. Như ở đây đã nói:
                        Originally posted by 11520686 View Post
                        cái sai ở hàm addafterq của bạn: khi giá trị q khác NULL thì đã thêm p vào danh sách
                        if(q!=NULL)
                        {
                        p->pNext=q->pNext;
                        q->pNext=p;
                        }
                        sau hàm trên p được nối vào danh sách. Giả sử q là nút cuối cùng nếu viết như trên thì sau khi thêm p vào sau q, l.ptail vẫn là q và tiếp tục xuống dưới lại thêm tiếp p vào sau q
                        if(l.pTail==q)
                        addtail(l,p);
                        vậy là p được thêm 2 lần vào danh sách->danh sách có 2 nhánh.
                        Rõ ràng, khi q là nút nằm cuối danh sách thì nó cũng không NULL (q!=NULL), vậy nên thêm 2 nút 1 lượt.
                        Còn nếu e muốn giữ nguyên tư duy đó (khi q khác NULL, thì việc add node sẽ liên quan tới q, sau đó coi q ở giữa hay cuối List mà chém. Còn khi q là NULL, thì ta quy ước nó đưa p vào đầu List), có thể sửa kiểu này:
                        PHP Code:
                        void addafterq(list &l,node *q,node *p

                            if(
                        q!=NULL
                            {
                                if(
                        l.pTail==q
                                  
                        addtail(l,p); 
                                else 
                        //khi q nằm giữa list
                                  
                        p->pNext=q->pNext
                                  
                        q->pNext=p
                            }
                            else
                            {
                                 
                        addHead(l,p);
                            }      


                        Last edited by 10520437; 29-05-2012, 19:12.

                        Comment


                        • #13
                          Originally posted by 11520158 View Post
                          - lúc trước dùng c-free cần return, nhưng em cứ quên return hoài(đến đó là cứ quên hjx)
                          - em dùng code blocks 10.05 anh có thể kiểm tra đoạn code ở trên là em copy hoàn toàn từ máy mình không sửa gì hết
                          -em thấy các hàm khác cũng vậy không cần return cũng chạy không báo lổi giống như đoạn code ở tren em đã thêm return p và chạy rồi bỏ return p rồi chạy vẩn cùng 1 kết quả không biết code blocks làm gì nửa,
                          - anh nào hiểu rõ vấn đề này giải thích hộ em nha, thanks
                          Muốn hiểu tại sao nhiều khi không có return vẫn chạy thì em xem cái này.
                          Ever since I realized many years ago, that this doesn't produce an error by default (in GCC at least), I've always wondered why? I understand that you can issue compiler flags to produce a warning...


                          Đọc để biết và sau này nhớ phải thêm return vô. Bỏ cái return không làm cho code ngắn gọn hơn bao nhiêu nhưng chỉ tăng tính khó hiểu, giảm tính tương thích và tiếp tay cho tật hay quên của em nữa.

                          Comment


                          • #14
                            Thấy topic này thảo luận về CTDL&GT vui quá ! Em hỏi thêm nhé : Hầu hết các giáo trình về CTDL&GT duyệt list (đi từ đầu đến cuối list) với "While" là chủ yếu, như em học được biết là " While " với " For " gần tương đương nhau, vậy em có thể thay đổi là dùng lệnh "For" cho các dòng lệnh được không ? Nếu không thì cho em biết tại sao ?

                            Comment


                            • #15
                              Originally posted by 10520430 View Post
                              Thấy topic này thảo luận về CTDL> vui quá ! Em hỏi thêm nhé : Hầu hết các giáo trình về CTDL> duyệt list (đi từ đầu đến cuối list) với "While" là chủ yếu, như em học được biết là " While " với " For " gần tương đương nhau, vậy em có thể thay đổi là dùng lệnh "For" cho các dòng lệnh được không ? Nếu không thì cho em biết tại sao ?
                              Giáo trình dùng while nhưng đồng thời cũng không giáo trình nào nói là không được dùng for cả

                              Comment

                              LHQC

                              Collapse
                              Working...
                              X