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

Đề tài: Giúp mình sửa lỗi việc chèn số trong danh sách liên kết đơn

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

    Mặc định Giúp mình sửa lỗi việc chèn số trong danh sách liên kết đơn

    Đề cho là tạo danh sách liên kết 8 số ngẫu nhiên.trong khoảng[1,20].Sau đó nhập vào 1 số nguyên X.rồi kiểm tra xem trong dslk đó có số nào bằng X ko. Nếu bằng thì chèn sau X 1 số là X+1.Và chèn trước 1 số X-1.
    Ở đây mình đã tạo danh sách và viết code chèn sau X+1 rồi(ban đầu là viết hàm nhưng cứ sai 1 lỗi này hoài nên mình viết gộp vào main() luôn). CHương trình không báo lỗi nhưng khi chạy thì nó lại ko hiện lên danh sách mới và để 1 lát thì máy chạy rất chậm.phải tắt chương trình đi thì máy mới chạy lại bt... Mong các bạn hướng dẫn mình những vấn đề thắc mắc này vs.
    P.s: Bác nào hảo tâm thì viết ra hàm chèn riêng giùm mình luôn nhé.
    Đây là code
    Code:
    #include<stdio.h>
    #include<conio.h>
    #include<stdlib.h>
    #include<time.h>
    #include<malloc.h>
    typedef struct pp{
            int mang;
            struct pp *next;
            }dslk;
    int ngaunhien(int a,int b){
        int c;
        void srand ( unsigned int seed );
        c=rand()%(b-a+1)+a;
        return c;
    }
    int taodanhsach(dslk L,dslk **pdau){
        int i=0,a=1,b=20,n=8;
        dslk *p;
        *pdau=NULL;
        while(i<n){
                   if(*pdau==NULL){
                                  *pdau=(dslk*)malloc(sizeof(dslk));
                                  p=*pdau;
                                  }
                   else{
                        p->next=(dslk*)malloc(sizeof(dslk));
                        p=p->next;
                        }
                   p->mang=ngaunhien(a,b);
                   p->next=NULL;
                   i++;
                   }
    }
    int main(){
        dslk L,*p,*pdau,*p2,*pchen;
        int x;
        taodanhsach(L,&pdau);
        p=pdau;
        while(p!=NULL){
                        printf("%d\t",p->mang);
                        p=p->next;
                        }
        printf("\n");
        printf("Nhap x");
        scanf("%d",&x);
        p=pdau;
        while(p!=NULL){
                       if(p->mang==x){
                                     pchen=(dslk*)malloc(sizeof(dslk));
                                     pchen->mang=x+1;
                                     p->next=p2;
                                     p->next=pchen;
                                     pchen->next=p2;
                                     }
                       else p=p->next;
                       }
         p=pdau;
        while(p!=NULL){
                        printf("%d\t",p->mang);
                        p=p->next;
                        }
        getch();
    }

  2. #2
    Ngày gia nhập
    11 2012
    Bài viết
    136

    Bạn xem lại mấy dòng này trước này, máy bị lag khả năng do cái này
    C Code:
    1. p->next=p2;
    2. p->next=pchen;
    3. pchen->next=p2
    tự nhiện lại gán =p2, mà p2 chưa được khởi tạo mà đang có giá trị ngẫu nhiên khiến,p->next sau khi gán bằng p2; khiến việc chèn danh sách giờ ở ngoài dslk chứ không còn là danh sách ban đầu. Bạn xem cách sử dụng hàm srand này chứ bạn viết là nguyên mẫu hàm của nó http://www.cplusplus.com/reference/c...cstdlib/srand/
    Giao lưu và học hỏi
    https://www.facebook.com/kimcy1992

  3. #3
    Ngày gia nhập
    02 2010
    Bài viết
    113

    Bài này có 5 trường hợp xảy ra:
    C Code:
    1. 1. Nhập vào x nhưng không có giá trị nào trong danh sách = x
    2. 2. Giá trị của x = với thành phần dữ liệu của NODE đầu tiên trong danh sách
    3. 3. Giá trị của x = với thành phần dữ liệu của NODE cuối cùng trong danh sách
    4. 4. Giá trị của x = với thành phần của NODE nằm ở giữa danh sách
    5. 5. Giá trị của x trùng với thành phần dữ liệu của nhìu NODE trong danh sách ta chỉ xét NODE đầu tiên có thành phần dữ liệu trùng với x)
    C Code:
    1. //trường hợp 1 nên xét ở hàm main
    2. void Them(DS,NODE*p, int x)//p là NODE đầu tiên có thành phần dữ liệu =x
    3. {
    4.     if(DS==NULL)
    5.         return;
    6.     if(p==phần tử đầu tiên của danh sách)
    7.     {
    8.                 //thêm vào  phần tử đầu 1 NODE có giá trị bằng x+1
    9.         NODE *x1=GetNode(x+1);
    10.         NODE *q=Phần tử đầu->pNext;
    11.         Phần tử đầu->pNext=x1;
    12.         x1->pNext=q;
    13.                 //thêm vào đầu danh sách 1 Node có giá trị bằng x-1
    14.         AddHead(l,x-1);
    15.        
    16.         return;
    17.     }
    18.     if(p==Phần tử cuối)
    19.     {
    20.                 // thêm trước phần tử cuối 1 NODE có giá trị là x-1
    21.         NODE *x2=GetNode(x-1);
    22.         NODE *q=BeforeTail(l);//tìm phần tử kế cuối
    23.         q->pNext=x2;
    24.         x2->pNext=Phần tử cuối;
    25.                 //thêm sau phần tử cuối 1 NODE có gt là x+1
    26.         AddTail(l,x+1);
    27.                
    28.         return;
    29.     }
    30.         //Thêm NODE có gt=x+1 sau p
    31.     NODE *a=p->pNext;
    32.     NODE *x1=GetNode(x+1);
    33.     p->pNext=x1;
    34.     x1->pNext=a;
    35.         //Thêm NODE có gt=x-1 trước p
    36.     NODE *b=Before(l,p);
    37.     NODE *x2=GetNode(x-1);
    38.     b->pNext=x2;
    39.     x2->pNext=p;
    40. }
    Đã được chỉnh sửa lần cuối bởi utkunglt : 23-11-2012 lúc 08:19 PM.

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

    Trích dẫn Nguyên bản được gửi bởi kimcy1992 Xem bài viết
    Bạn xem lại mấy dòng này trước này, máy bị lag khả năng do cái này
    C Code:
    1. p->next=p2;
    2. p->next=pchen;
    3. pchen->next=p2
    tự nhiện lại gán =p2, mà p2 chưa được khởi tạo mà đang có giá trị ngẫu nhiên khiến,p->next sau khi gán bằng p2; khiến việc chèn danh sách giờ ở ngoài dslk chứ không còn là danh sách ban đầu. Bạn xem cách sử dụng hàm srand này chứ bạn viết là nguyên mẫu hàm của nó http://www.cplusplus.com/reference/c...cstdlib/srand/
    mình sửa lại rồi mà vẫn không được bạn à.
    Trích dẫn Nguyên bản được gửi bởi utkunglt Xem bài viết
    Bài này có 5 trường hợp xảy ra:
    C Code:
    1. 1. Nhập vào x nhưng không có giá trị nào trong danh sách = x
    2. 2. Giá trị của x = với thành phần dữ liệu của NODE đầu tiên trong danh sách
    3. 3. Giá trị của x = với thành phần dữ liệu của NODE cuối cùng trong danh sách
    4. 4. Giá trị của x = với thành phần của NODE nằm ở giữa danh sách
    5. 5. Giá trị của x trùng với thành phần dữ liệu của nhìu NODE trong danh sách ta chỉ xét NODE đầu tiên có thành phần dữ liệu trùng với x)
    C Code:
    1. //trường hợp 1 nên xét ở hàm main
    2. void Them(DS,NODE*p, int x)//p là NODE đầu tiên có thành phần dữ liệu =x
    3. {
    4.     if(DS==NULL)
    5.         return;
    6.     if(p==phần tử đầu tiên của danh sách)
    7.     {
    8.                 //thêm vào  phần tử đầu 1 NODE có giá trị bằng x+1
    9.         NODE *x1=GetNode(x+1);
    10.         NODE *q=Phần tử đầu->pNext;
    11.         Phần tử đầu->pNext=x1;
    12.         x1->pNext=q;
    13.                 //thêm vào đầu danh sách 1 Node có giá trị bằng x-1
    14.         AddHead(l,x-1);
    15.        
    16.         return;
    17.     }
    18.     if(p==Phần tử cuối)
    19.     {
    20.                 // thêm trước phần tử cuối 1 NODE có giá trị là x-1
    21.         NODE *x2=GetNode(x-1);
    22.         NODE *q=BeforeTail(l);//tìm phần tử kế cuối
    23.         q->pNext=x2;
    24.         x2->pNext=Phần tử cuối;
    25.                 //thêm sau phần tử cuối 1 NODE có gt là x+1
    26.         AddTail(l,x+1);
    27.                
    28.         return;
    29.     }
    30.         //Thêm NODE có gt=x+1 sau p
    31.     NODE *a=p->pNext;
    32.     NODE *x1=GetNode(x+1);
    33.     p->pNext=x1;
    34.     x1->pNext=a;
    35.         //Thêm NODE có gt=x-1 trước p
    36.     NODE *b=Before(l,p);
    37.     NODE *x2=GetNode(x-1);
    38.     b->pNext=x2;
    39.     x2->pNext=p;
    40. }
    đây là danh sách liên kết kép à bạn

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

    Trích dẫn Nguyên bản được gửi bởi chetlahet_92 Xem bài viết
    đây là danh sách liên kết kép à bạn
    nhìn chỗ nào nói kép vậy chài...????

  6. #6
    Ngày gia nhập
    11 2012
    Bài viết
    136

    Mặc định Giúp mình sửa lỗi việc chèn số trong danh sách liên kết đơn

    Trích dẫn Nguyên bản được gửi bởi utkunglt Xem bài viết
    nhìn chỗ nào nói kép vậy chài...????
    Em nghĩ bạn ý nên viết và thiết kế giải thuật cho bài toán của mình trước khi code. Design before coding
    Giao lưu và học hỏi
    https://www.facebook.com/kimcy1992

  7. #7
    Ngày gia nhập
    02 2010
    Bài viết
    113

    Trích dẫn Nguyên bản được gửi bởi kimcy1992 Xem bài viết
    Em nghĩ bạn ý nên viết và thiết kế giải thuật cho bài toán của mình trước khi code. Design before coding
    ừh!!! vấn đề thì út đã nêu ở trên rồi!!! bây giờ chỉ còn trình bày ra nữa thoy!!!
    tùy theo style mỗi người mà code!!!
    mong sớm nhận được code hoàn chỉnh của chủ topic!!!

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

    Trích dẫn Nguyên bản được gửi bởi utkunglt Xem bài viết
    ừh!!! vấn đề thì út đã nêu ở trên rồi!!! bây giờ chỉ còn trình bày ra nữa thoy!!!
    tùy theo style mỗi người mà code!!!
    mong sớm nhận được code hoàn chỉnh của chủ topic!!!
    cảm ơn mấy bạn.Mình làm được rồi.nếu rảnh thì kiểm tra xem có lỗi j ko giúp mình vs nhé.Mình thấy code mình dài quá.
    Code:
    #include<stdio.h>
    #include<conio.h>
    #include<stdlib.h>
    #include<time.h>
    #include<malloc.h>
    typedef struct pp{
            int mang;
            struct pp *next;
            }dslk;
    int ngaunhien(int a,int b){
        int c;
        void srand ( unsigned int time() ) ;
        
        c=rand()%(b-a+1)+a;
        return c;
    }
    dslk* getnode(int x){
        dslk *p;
        p=(dslk*)malloc(sizeof(dslk));
        p->mang=x;
        return p;
        }
    dslk* tail(dslk **pdau){
          dslk *p;
          p=*pdau;
          while(p!=NULL){
          if(p->next==NULL) break;
          p=p->next;
          }
          return p;
    }
    dslk* before(dslk **pdau,int n){
          dslk *q;
          q=*pdau;
          int i=1;
          while(i<(n-1)){
                     q=q->next;
                     i++;
                     }
          return q;    
    }
    int insert_top(dslk **pdau,int x){
        dslk *q;
        q=getnode(x);
        q->next=*pdau;
        *pdau=q;
    }
    int insert_bottom(dslk **p1,int x){
        dslk *q,*p;
        p=*p1;
        q=getnode(x);
        p->next=q;
        q->next=NULL;
    }
    int insert_behind(dslk **p,int x){
        dslk *q,*k,*n;
        k=*p;
        n=k->next;
        q=getnode(x);
        if(k->next=NULL) insert_bottom(&k,x);
        else{
        q->next=n;
        k->next=q;
        }
    }
    int taodanhsach(dslk **pdau){
        int i=1,a=1,b=20,n=8;
        dslk *p;
        *pdau=NULL;
        while(i<=n){
                   if(*pdau==NULL){
                                  *pdau=(dslk*)malloc(sizeof(dslk));
                                  p=*pdau;
                                  }
                   else{
                        p->next=(dslk*)malloc(sizeof(dslk));
                        p=p->next;
                        }
                   p->mang=ngaunhien(a,b);
                   p->next=NULL;
                   i++;
                   }
    }
    int main(){
        dslk L,*p,*pdau,*p1,*q;
        int x,i=1,n=0;
        taodanhsach(&pdau);
        p=pdau;
        
        while(p!=NULL){
                        printf("%d\t",p->mang);
                        p=p->next;
                        n++;
                        }
        printf("\n");
        printf("Nhap x");
        scanf("%d",&x);
        p=pdau;
        while(p!=NULL){                                           
                       if((p->mang==x)){
                                        if((i!=1)&&(i!=n)){
                                                          q=before(&pdau,i);
                                                          insert_behind(&q,x-1);
                                                          insert_behind(&p,x+1);
                                                          i=i+2;
                                                          n=n+2;
                                                          p=p->next;
                                                          }
                                        if(i==1){
                                                 insert_behind(&pdau,x+1);
                                                 insert_top(&pdau,x-1);
                                                 i=i+2;
                                                 n=n+2;
                                                 p=p->next;
                                                 }
                                        if(i==n){
                                                 p1=tail(&pdau);
                                                 q=before(&pdau,n);
                                                 insert_behind(&q,x-1);
                                                 insert_bottom(&p1,x+1);
                                                 n=n+2;
                                                 }
                                      }
                       p=p->next;
                       i++;
                       }
        p=pdau;
        
        while(p!=NULL){
                        printf("%d\t",p->mang);
                        p=p->next;
                        }
        
                       
        getch();
    }
    Đã được chỉnh sửa lần cuối bởi chetlahet_92 : 29-11-2012 lúc 02:20 PM.

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

  1. Lập trình C++ giúp e bài thêm/xoá phần tử trong danh sách liên kết đơn với :)
    Gửi bởi duhocsinhlx trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 5
    Bài viết cuối: 30-09-2013, 01:43 PM
  2. Mọi người tìm lỗi giúp tôi trong hàm nhập danh sách liên kết với!
    Gửi bởi conga2012 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 4
    Bài viết cuối: 13-12-2012, 03:30 PM
  3. Giúp đỡ danh sách liên kết đơn trong c
    Gửi bởi lytnhan trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 4
    Bài viết cuối: 25-04-2012, 11:46 AM
  4. xóa phần tử cuối trong danh sách liên kết? cần giúp
    Gửi bởi lklnn trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 21-04-2010, 08:58 PM
  5. Tìm kiếm vị trí trong danh sách liên kết. Giúp em với!
    Gửi bởi theanh3112 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 23-12-2008, 12:22 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