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

Đề tài: Xoá 1 node có khoá là x trong danh sách liên kết đơn

  1. #1
    Ngày gia nhập
    03 2011
    Bài viết
    25

    Mặc định Xoá 1 node có khoá là x trong danh sách liên kết đơn

    mình có code này mong các bạn cho ý kiến vì mình vẫn chưa tìm được lỗi sai . Yêu cầu : nhập 1 danh sách liên kết đơn là số nguyên , xoá phần tử có khoá là x trong danh sách đả cho

    Code:
    typedef int datatype;
    struct node
    {
       struct node *next;
       datatype data;
    };
    void  deletex(node *&phead,int x)
    {
         for(node *p=phead;p!=NULL;p=p->next)
                 if(p->data == x)
                 {
                     node *q=new node;
                     q=p;
                     p=q->next;
                     delete q;
                 }
    }

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

    Phải có hàm nhập nữa. Còn đây là hàm xóa
    void deletex(node &phead,int x)
    {
    node *before,*p;
    p=phead;
    while((p!=NULL) && (p->data!=x))
    {
    before=p;
    p=p->next;
    }
    if(p)
    {
    if(p==phead) phead=p->next;
    else before->next=p->next;
    delete p;
    }
    }
    Đã được chỉnh sửa lần cuối bởi HONG REU : 06-11-2011 lúc 08:00 PM.

  3. #3
    Ngày gia nhập
    12 2010
    Nơi ở
    Tp HCM
    Bài viết
    6

    Trích dẫn Nguyên bản được gửi bởi giacmo1612 Xem bài viết
    mình có code này mong các bạn cho ý kiến vì mình vẫn chưa tìm được lỗi sai . Yêu cầu : nhập 1 danh sách liên kết đơn là số nguyên , xoá phần tử có khoá là x trong danh sách đả cho

    Code:
    typedef int datatype;
    struct node
    {
       struct node *next;
       datatype data;
    };
    void  deletex(node *&phead,int x)
    {
         for(node *p=phead;p!=NULL;p=p->next)
                 if(p->data == x)
                 {
                     node *q=new node;
                     q=p;
                     p=q->next;
                     delete q;
                 }
    }
    Một nguyên tắc trong DSLK là khi xóa bất cứ node nào cũng phải cô lập nó trước thì mới không bị mất dữ liệu.Bạn delete q nhưng lại chưa tách q ra khỏi DS.
    Ở đây node cần xóa là p chứ không phải là q vì (p->data==x) mà.Sau khi tìm được p,bạn phải cô lập nó,nghĩa là làm cho node trước nó liên kết với node sau nó.Cuối cùng mới delete p.
    Còn một vấn đề nữa là bạn dùng vòn lặp for(..) để tìm node có khóa x là rất bất tiện và tốn thời gian chạy nữa.Vì khi đã tìm được p (có khóa x) rồi vòng lặp vẫn cứ tiếp tục cho đến hết DS
    Bạn có thể tham khảo code của HONG REU ấy.

  4. #4
    Ngày gia nhập
    03 2011
    Bài viết
    25

    thanks 2 bạn rất nhiều nha chúc sức khoẻ ^ ^

  5. #5
    Ngày gia nhập
    02 2011
    Bài viết
    1

    nếu chưa đc bạn thử tham khảo code này..
    void xoabk(node *&head)
    {
    int x;
    node *tam=head;
    printf("\nNhap vao data x can xoa:");
    scanf("%d",&x);
    while(tam->next->data!=x && tam!=NULL)
    tam=tam->next;
    if(tam==NULL)
    printf("\nKhong co data x can xoa");
    else
    {
    node *tam2=tam->next;
    tam->next=tam2->next;
    tam2->next=NULL;
    free(tam2);
    }
    printf("\nSau khi xoa data x\n");
    xuatds(head);
    }
    còn đây là nhập xuất.
    #include<stdio.h>
    #include<conio.h>
    #include<stdlib.h>
    #include<alloc.h>
    struct node
    {
    int data;
    node *next;
    };
    node *taonode(int x)
    {
    node *p;
    p=new node();
    p->data=x;
    p->next=NULL;
    return(p);
    }
    void taods(node *&head)
    {
    node *p;
    head=NULL;
    int x;
    do
    {
    printf("\nNhap vao x:");
    scanf("%d",&x);
    if(x!=0)
    {
    p=taonode(x);
    if(head==NULL)
    head=p;
    else
    {
    p->next=head;
    head=p;
    }
    }
    }while(x!=0);
    }
    void xuatds(node *&head)
    {
    node *tam;
    tam=head;
    while(tam!=NULL)
    {
    printf("\t%d",tam->data);
    tam=tam->next;
    }
    }
    hàm main tự viết nha bạn

  6. #6
    Ngày gia nhập
    10 2011
    Bài viết
    552

    Mặc định Xoá 1 node có khoá là x trong danh sách liên kết đơn

    Trích dẫn Nguyên bản được gửi bởi vcthanh Xem bài viết
    Một nguyên tắc trong DSLK là khi xóa bất cứ node nào cũng phải cô lập nó trước thì mới không bị mất dữ liệu.Bạn delete q nhưng lại chưa tách q ra khỏi DS.
    Ở đây node cần xóa là p chứ không phải là q vì (p->data==x) mà.Sau khi tìm được p,bạn phải cô lập nó,nghĩa là làm cho node trước nó liên kết với node sau nó.Cuối cùng mới delete p.
    Còn một vấn đề nữa là bạn dùng vòn lặp for(..) để tìm node có khóa x là rất bất tiện và tốn thời gian chạy nữa.Vì khi đã tìm được p (có khóa x) rồi vòng lặp vẫn cứ tiếp tục cho đến hết DS
    Bạn có thể tham khảo code của HONG REU ấy.
    Ấy bậy quá.
    Vét toàn bộ DSLK để coi còn sót phần tử p nào có data = x nữa chứ. (Áp dụng cho bài xóa sạch những khóa =x)
    Chạy hết dãy là điều tất nhiên.
    Với lại vòng lặp thì vòng nào cũng như vòng nào, làm sao có chuyện phân biệt for chạy chậm, while chạy nhanh. Vòng nào mà chả : "lặp lại công việc, kiểm tra điều kiện..." ?? Cốt yếu là do ta sử dụng thế nào thôi chứ

    Code bạn chủ gần đúng rùi, chỉ sửa lại chút xíu thôi
    C++ Code:
    1. void  deletex(node *&phead,int x)
    2. {
    3.      // Thủ thuật chèn đầu 1 node ảo để khỏi biện luận mất công
    4.      // Để mọi việc xóa đều là xóa giữa và xóa cuối cả, ko sợ bị xóa đầu.
    5.      node *virtualnode=new node;
    6.      virtualnode->next=phead;
    7.      phead=virtualnode;
    8.      node *q;
    9.      // Ta kiểm tra p->next, và cần xóa p->next chứ ko dùng trực tiếp p.
    10.      //Bởi còn phải nắm lấy Node trước(tức là p) để nối tiếp list kẻo đứt list
    11.      for(node *p=phead;p->next!=NULL;p=p->next)
    12.              if(p->next->data == x)
    13.              {
    14.                 // node *q=new node; //Bỏ new node đi. Xây nhà mà ko xài là phí đất đấy
    15.                 // Hàm này để phá nhà chứ ko xây thêm nhà
    16.                  q=p->next; // q là nốt cần xóa
    17.                  p->next=q->next; // p->next=p->next->next; . Nối lại list, cô lập q
    18.                  delete q;
    19.              }
    20.      // Xóa virtual, trả lại nguyên trạng
    21.      phead=phead->next;
    22.      delete virtualnode;
    23. }
    Đã được chỉnh sửa lần cuối bởi clchicken : 23-11-2011 lúc 10:59 AM.
    Um Mani Padme Hum...!!

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

  1. Bài tập C Xác định loop trong danh sách liên kết Node
    Gửi bởi cena2012 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 03-10-2013, 12:01 AM
  2. Hoán vị Node trong danh sách liên kết
    Gửi bởi rongphuthuy1 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 16
    Bài viết cuối: 04-05-2013, 12:30 AM
  3. Cấu trúc dữ liệu Cách xóa một Node bất kỳ trong danh sách liên kết đơn?
    Gửi bởi A10932 trong diễn đàn Thắc mắc CTDL & Giải thuật
    Trả lời: 4
    Bài viết cuối: 17-01-2013, 11:44 PM
  4. Kỹ thuật C++ Xóa Node ở vị trí k trong Danh Sách Liên Kết đơn vòng
    Gửi bởi it_p0k3t 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: 27-02-2012, 06:38 PM
  5. lỗi khi tạo node mới trong danh sách liên kết
    Gửi bởi hoanghiep9x trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 2
    Bài viết cuối: 21-03-2011, 11:00 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