Announcement

Collapse
No announcement yet.

xem lỗi của đoạn code xoá đuôi trong dslk đơn

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

  • xem lỗi của đoạn code xoá đuôi trong dslk đơn

    PHP Code:
    void removetail(list &l)
    {
        if(
    l.head != NULL)
        {
            
    node *p=l.head;
            while(
    p->next != l.tail)
                
    p->next;
            
    delete l.tail;
            
    l.tail p;
            
    l.tail ->next NULL;
        }

    em tìm mãi mà không phát hiện thấy lỗi gì, chương trình thì chạy mượt nhưng kết quả lại sai.
    Tôi không hối tiếc những gì mình đã làm. Tôi chỉ hối tiếc những gì đã không làm khi có cơ hội!

  • #2
    mình nghĩ là có thể do l.tail->next= NULL;
    theo mình đúng có lẽ là l.tail->next=p;
    vì khi bạn cho next của l.tail trỏ vào NULL thì giống như chỗ đó dslk bị cắt mất ko xác định dc típ đó là gì hoặc đã kết thúc chưa.Giống như khi thêm 1 node vào đuôi next của tail vẫn trỏ lại p để xác định đó là tail

    Comment


    • #3
      Bạn thử thay đoạn code l.tail->next thành l.tail->next=p->next xem thử thế nào

      Comment


      • #4
        Originally posted by 11520176 View Post
        mình nghĩ là có thể do l.tail->next= NULL;
        theo mình đúng có lẽ là l.tail->next=p;
        vì khi bạn cho next của l.tail trỏ vào NULL thì giống như chỗ đó dslk bị cắt mất ko xác định dc típ đó là gì hoặc đã kết thúc chưa.Giống như khi thêm 1 node vào đuôi next của tail vẫn trỏ lại p để xác định đó là tail
        next của tail trong danh sách liên kết luôn luôn phải là NULL. Gán l.tail->next = NULL là đúng rồi. Em gán = p thì sẽ có một cái vòng lẩn quẩn ngay đuôi danh sách và sách không bao giờ kết thúc.

        Originally posted by 11520537 View Post
        PHP Code:
        void removetail(list &l)
        {
            if(
        l.head != NULL)
            {
                
        node *p=l.head;
                while(
        p->next != l.tail)
                    
        p->next;
                
        delete l.tail;
                
        l.tail p;
                
        l.tail ->next NULL;
            }

        em tìm mãi mà không phát hiện thấy lỗi gì, chương trình thì chạy mượt nhưng kết quả lại sai.
        Em chưa xét trường hợp khi danh sách chỉ có duy nhất một phần tử.

        Comment


        • #5
          Đúng như anh An nói là thiếu phần kiểm tra nếu danh sách chỉ có 1 phần tử, khi đó cần cập nhật lại head và tail về NULL.
          Ngoài ra thì mình thấy đoạn code trên là đúng rồi, không biết bạn bảo kết quả sai là sai như thế nào? :-/

          Comment


          • #6
            Originally posted by 08520297 View Post
            Đúng như anh An nói là thiếu phần kiểm tra nếu danh sách chỉ có 1 phần tử, khi đó cần cập nhật lại head và tail về NULL.
            Ngoài ra thì mình thấy đoạn code trên là đúng rồi, không biết bạn bảo kết quả sai là sai như thế nào? :-/
            không phải chỉ có cập nhật l.head về NULL là được đâu bạn ak. vì nếu thế thi chương trình sẽ bị lỗi ở câu lệnh while(p->next != l.tail) này rồi. theo mình thì bạn nên làm như sau đầy đủ hơn
            PHP Code:
            void removetail(list &l

                
            node *q;
                if(
            l.head != NULL
                { 
                    
            node *p=l.head
                    
            q=NULL;
                    while( 
            p->next != NULL
                    {
                        
            q=p;
                        
            p->next
                    }
                    
            delete p
                    if(
            q==NULLl.head=NULL;
                    else
                    {
                         
            l.tail q
                        
            l.tail ->next NULL;
                    }
                } 

            :love:
            Tương lai khóc hay cười phụ thuộc vào độ lười của quá khứ.
            :cry:

            Comment


            • #7
              chỉ cần thêm đoạn check:

              void removetail(list &l)
              {
              if(l.head != NULL)
              {
              node *p=l.head;

              if(p->next == NULL) {
              delete p;
              l.head = l.tail = NULL;
              return;
              }

              while(
              p->next != l.tail)
              p = p->next;
              delete l.tail;
              l.tail = p;
              l.tail ->next = NULL;
              }
              }

              Last edited by 08520297; 07-06-2012, 04:33.

              Comment


              • #8
                nếu thế thì em sửa lại code:

                PHP Code:
                void removetail(list &l)
                {
                    if(
                l.head != NULL)
                    {
                        if(
                l.head == l.tail)
                            
                l.head l.tail NULL;
                        else
                        {
                            
                node *p=l.head;
                            while(
                p->next != l.tail)
                                
                p->next;
                            
                delete l.tail;
                            
                l.tail p;
                            
                l.tail ->next NULL;
                        }
                    }

                các anh thấy việc kiểm tra và xoá danh sách chỉ có 1 phần tử ổn chưa? vì theo em nghĩ bản chất của việc xoá là ghi đè dữ liệu rỗng lên đĩa, nên không cần xoá mà chỉ cần gán cho nó bằng NULL là ổn.
                Last edited by 11520537; 07-06-2012, 16:15.
                Tôi không hối tiếc những gì mình đã làm. Tôi chỉ hối tiếc những gì đã không làm khi có cơ hội!

                Comment


                • #9
                  Originally posted by 11520537 View Post
                  nếu thế thì em sửa lại code:

                  PHP Code:
                  void removetail(list &l)
                  {
                      if(
                  l.head != NULL)
                      {
                          if(
                  l.head == l.tail)
                              
                  l.head l.tail NULL;
                          else
                          {
                              
                  node *p=l.head;
                              while(
                  p->next != l.tail)
                                  
                  p->next;
                              
                  delete l.tail;
                              
                  l.tail p;
                              
                  l.tail ->next NULL;
                          }
                      }

                  các anh thấy việc kiểm tra và xoá danh sách chỉ có 1 phần tử ổn chưa? vì theo em nghĩ bản chất của việc xoá là ghi đè dữ liệu rỗng lên đĩa, nên không cần xoá mà chỉ cần gán cho nó bằng NULL là ổn.
                  Em chưa gọi lệnh delete. Bản chất của việc xóa không phải là ghi đè mà là đánh dấu cho hệ thống biết vùng nhớ không được sử dụng nữa. Việc đánh dấu này thực hiện bằng lệnh delete. Còn gán bằng NULL là để báo hiệu danh sách rỗng thôi, phải đủ cả 2 mới được.

                  Sửa xong rồi thì em chạy thử lại coi còn lỗi không.

                  Comment


                  • #10
                    Originally posted by 07520004 View Post
                    Em chưa gọi lệnh delete. Bản chất của việc xóa không phải là ghi đè mà là đánh dấu cho hệ thống biết vùng nhớ không được sử dụng nữa. Việc đánh dấu này thực hiện bằng lệnh delete. Còn gán bằng NULL là để báo hiệu danh sách rỗng thôi, phải đủ cả 2 mới được.

                    Sửa xong rồi thì em chạy thử lại coi còn lỗi không.
                    ồ xong rồi, cảm ơn anh.
                    Tôi không hối tiếc những gì mình đã làm. Tôi chỉ hối tiếc những gì đã không làm khi có cơ hội!

                    Comment

                    LHQC

                    Collapse
                    Working...
                    X