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

Đề tài: Danh sách móc nối đơn

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

    Post Danh sách móc nối đơn

    Mong các bạn giúp mình sửa đoạn code này
    dưới đây là code với đề bài là tạo lập 1 dãy số nguyên, thêm, xóa 1 số trước vị trí trỏ bởi p:
    C Code:
    1. #include<stdio.h>
    2. #include<conio.h>
    3. #include<stdlib.h>
    4. #include<ctype.h>
    5. struct node
    6.     { int x;
    7.       struct node *next;}pt;
    8. typedef struct node *nodeptr;
    9. nodeptr first,last;
    10. nodeptr new_node(){
    11.     nodeptr p;
    12.     p=(nodeptr) malloc(sizeof(struct node));
    13.     return(p);
    14.     }
    15.  
    16. void insert_first(nodeptr &first,int y)
    17. {
    18.     nodeptr p;
    19.     p=new_node();
    20.     p->x=y;
    21.     p->next=first;
    22.     first=p;
    23. }
    24. void duyet(nodeptr first)
    25. {       nodeptr p;
    26.     p=first;
    27.     if(p==NULL)
    28.         printf("Khong co so nao");
    29.     while(p!=NULL)
    30.         {printf("\n %d",p->x);getch();
    31.         p=p->next;
    32.         }
    33.         }
    34.  
    35. void insert_before(nodeptr p,nodeptr first,int y)
    36. {
    37.     nodeptr q,q1;
    38.     if(p==first)
    39.     insert_first(first,y);
    40.     else
    41.     { q=new_node();
    42.     q->x=y;
    43.     q->next=p;
    44.     q1=first;
    45.     while(q1->next!=p){ q1=q1->next;q1->next=q;}
    46.     }
    47. }
    48. void del_before(nodeptr p,nodeptr first)
    49. {   nodeptr q;
    50.     if(p==first) first=first->next;
    51.         else {
    52.             q=first;
    53.             while(q->next!=p) q=q->next;
    54.             q->next=p->next;
    55.             }
    56.     free(p);
    57. }
    58. void khoitao(nodeptr &first)
    59. {first=NULL;}
    60. void nhap()
    61. {
    62. int ra=1,x;
    63. char c;
    64.  FILE *fp;
    65.  printf("\n Nhap day so nguyen ");
    66.  khoitao(first);
    67.  while(ra)
    68.  {
    69.   scanf("%d",&x);
    70.   insert_first(first,x);
    71.   printf("Tiep tuc...(c/k)");fflush(stdin);c=getchar();
    72.   if(toupper(c)!='C') ra=0;
    73.  }
    74.  
    75. }
    76. void main()
    77. {nodeptr p;
    78. khoitao(first);
    79. int thoat=1,n,x;
    80. while(thoat)
    81.   {printf("\n Chon cong viec ");
    82.   printf("\n 1/Nhap day so nguyen");
    83.   printf("\n 2/Them 1 so vao day");
    84.   printf("\n 3/Xoa 1 so trong day");
    85.   printf("\n 4/Hien thi day so");
    86.   printf("\n 5/thoat");
    87.   printf("\n Nhan so thich hop de chon cong viec");
    88.   fflush(stdin);
    89.   scanf("%d",&n);
    90.     clrscr();
    91.   switch(n){
    92.   case 1:nhap();break;
    93.   case 2:printf("\n Nhap so  ");scanf("%d",x);insert_before(p,first,x);break;
    94.   case 3:printf("\n Xoa so truoc do");del_before(p,first);break;
    95.   case 4: printf("\n Hien thi day so"); duyet(first);getch();break;
    96.   case 5: thoat=0;break;
    97.   }}}

    *Chú ý: Bỏ code vào tag code, xem hướng dẫn ở đây
    Đã được chỉnh sửa lần cuối bởi QuangHoang : 13-10-2008 lúc 02:27 PM. Lý do: Bổ xung phần còn thiếu nhưng vẫn chưa hoàn chỉnh

  2. #2
    Ngày gia nhập
    05 2008
    Bài viết
    14

    bạn nói yêu cầu với sửa cái jif chứ
    giờ say mê bên ai em đổ lỗi anh vô tình

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

    Đoạn code trên của mình bị lỗi vòng lặp vô tận ở trong insert_before và del_before. Mình đã thử sửa nhiều lần nhưng không thành công. Mong các bạn giúp mình với!!!!!!!!!!

  4. #4
    Ngày gia nhập
    09 2007
    Bài viết
    724

    C++ Code:
    1. while(q1->next!=p){ q1=q1->next;q1->next=q;}

    Bạn xem lại chổ này nhé.
    tại sao q1->next = q; vậy đây là bạn đang tìm kiếm đến node p mà.

    đề nghị bỏ đi câu lệnh q1->next = q; ra ngoài vòng lặp

    C++ Code:
    1. while(q1->next!=p){
    2.       q1=q1->next;
    3. }
    4. nodeptr tmp;
    5. tmp = q1->next; // lưu lại con trỏ sau của tmp
    6. q1->next=q;
    7. q->next = tmp; // gán lại q->next bằng tmp để không bị mất đoạn về sau .


    ps: chẳng thấy bạn giải phóng bộ nhớ ở đâu cả

  5. #5
    Ngày gia nhập
    02 2008
    Nơi ở
    Việt Nam
    Bài viết
    577

    Chào bạn, bạn nên chú ý một điều, ở thân hàm main bạn khai báo p như vậy nó sẽ chỉ đến một giá trị bất kì, vì thế tất nhiên sẽ sai và lặp vô hạn khi bạn dùng vòng lặp để search trong danh sách dù là để trong hàm bất kì nào.

    Vậy trước tiên là lỗi ở đó nhé. Sửa lỗi này như nào, bạn khởi gán p=NULL khi khai báo, nhưng để test đúng sai của hàm insert và delete thì bạn cần viết một hàm nữa là tìm một giá trị trong chuỗi trả về con trỏ node tại vị trí tìm thấy, dùng kết quả hàm đó để gán cho p, rồi test đúng sai cho 2 hàm kia. Có mệt chút nhưng như thế mới khá nhanh được.

    Về bài trên thì hàm insert có vấn đề Zkday đã sửa giúp bạn rồi thì phải.

    Chúc bạn học tốt!

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

    Mặc định Danh sách móc nối đơn

    Cảm ơn hai bạn đã nhiệt tình giúp mình! Những lỗi trên mình đã sửa được rồi.
    Nhưng mình thấy code trên còn cồng kềnh! Không biết có thể tinh chỉnh cho đơn giản hơn không???

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

    pro wa đây chính là vấn đề mình đang trăn trở lâu nay !!! đó là khả năng self-referential struct !!! nhưng mấy việc creat display insert remove thi đơn giản rồi !!! vì khi remove và insert có 1 target để thêm và bớt (tức là thêm và bớt trước 1 point đã được xác định tên ) !!! vấn đề còn lại là sắp xếp thì sao ???
    khi mình giải bài này có hơi khác so với bạn Trần Cường 1 chút đó là struct của mình bao gồm { name ,age ,next} vấn đề còn lại là sắp xếp theo tên theo bảng chữ cái !!! nếu tên trùng nhau thì sắp theo tuổi !!!!

    Nhiều lần Solve mà ko xong !!! bạn nào giúp mình với !!!

    Thêm 1 chút nữa cho hỏi chủ topic có phải Nguyễn Trần Cường (PFIEV hut K51) không nhỉ !!! khì khì

  8. #8
    Ngày gia nhập
    02 2008
    Bài viết
    15

    Cuối cùng cũng xong phần sắp xếp rùi !!! hì hì !!!
    Code:
    node *locate(node *head,char a[30]){
    	if(!strcmp(head->next->name,a)){
    		return (head);}
    	else if(head->next->next ==NULL){
    		return NULL;}
    	else {
    		locate(head->next,a);
    	}
    }
    hàm trên xác định vị trí 1 điểm trong nút giờ việc sắp xếp không khác gì các phần tử của mảng bình thường rồi
    so sánh phần tử 1 so với các phần tử 2 3 4 ... đến cuối dãy
    rồi so sánh 2 với 3 4 ... đến cuối dãy
    dùng hàm strcmp() để so sánh 2 tên và đổi chỗ thì làm như sau

    đặt vị trí đang đứng bằng temp còn tag1 là nút trước temp , tag2 là vị trí bất kì trước nút được so sánh
    tag1 = locate(head,temp->name);
    tag2=locate(head,node->name);
    trong đó node là 1 vị trí bất kì kể từ phần tử được xét đến cuối danh sách

    mô hình như sau
    tag1->temp->next1
    tag2->node->next2

    giờ phải đổi chỗ temp và node

    tag1->next=node;
    node->next=next1;

    tag2->next=temp;
    temp->next=next2;

    (việc đổi chỗ dùng khá nhiều biến trung gian ... nhưng có lẽ chi tiết như thế dễ hiểu hơn ...hi hi)

    ngoài ra mình có đọc được người ta sắp xếp Danh Sách Móc Nối này bằng phương pháp trộn ( đọc 1 thôi 1 hồi cuối cùng chẳng hiểu nhiều lắm )
    Đã được chỉnh sửa lần cuối bởi ledinhtung61 : 05-01-2009 lúc 11:27 AM.

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

  1. Bài tập C++ bài tập về danh sách móc nối đơn
    Gửi bởi bigchicken trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 1
    Bài viết cuối: 05-10-2013, 08:56 PM
  2. Sắp xếp danh sách móc nối đơn
    Gửi bởi tranhungnd trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 0
    Bài viết cuối: 16-01-2011, 11:10 PM
  3. Xây dựng chương trình danh sách móc nối?
    Gửi bởi hung_23488 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 5
    Bài viết cuối: 16-08-2010, 03:16 PM
  4. Mã nguồn C Source danh sách móc nối đơn
    Gửi bởi onminh trong diễn đàn Thủ thuật, Tutorials và Mã nguồn C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 08-05-2010, 12:31 AM
  5. danh sách móc nối
    Gửi bởi badboya9_no1 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 2
    Bài viết cuối: 10-03-2010, 01:00 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