Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Trang 1 của 2 12 CuốiCuối
Kết quả 1 đến 10 của 12
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Ở đây bạn có con trỏ *ds là phần tử đầu tiên của danh sách, còn phần tử cuối của danh sách trỏ tới NULL. Khi ấy thì làm các câu e, g bạn phải viết hàm khác chứ không sử dụng được các hàm cơ bản như chèn nút mới vào sau một phần tử hoặc xóa một nút ngay sau nút đang xét.

    Với các bài toán về danh sách liên kết, mình thường sử dụng cấu trúc bao gồm 2 con trỏ làm mốc là first và last, với first trỏ tới phần tử đầu tiên của danh sách, còn last được phần tử cuối của danh sách trỏ tới, và cả 2 con trỏ này đều không có trường giá trị. Với cấu trúc đó, ví dụ bạn muốn làm câu e thì bạn không cần phải viết hàm insert_to_head hay delete_head gì cả, bạn chỉ cần dùng 2 hàm chèn nút mới vào sau một phần tử hoặc xóa một nút ngay sau nút đang xét để xử lý.


    Đây là hình minh họa cho cấu trúc của mình (trong ảnh thì head ~ first, và z ~ last của mình)
    Bây giờ với 2 hàm chèn nút mới vào sau một phần tử (mình gọi là insert(node *t, key x)) và xóa một nút ngay sau nút đang xét (mình gọi là delete(node *t)), mình sẽ đưa ra hướng giải các bài toán của bạn.

    a. Xóa các số chẵn -> Bạn duyệt từ nút first, nếu thấy nút nào mà sau nó là một số chẵn, thì gọi hàm delete(t) để xóa nút sau nó đến khi nút sau nó mang giá trị lẻ.

    b. Sắp xếp tăng, giảm dần -> Câu này mình thấy bạn đã làm được.

    c. Thêm số vào cuối danh sách -> Bạn duyệt từ đầu danh sách, đến khi một nút trỏ tới nút last thì dừng lại, sau đó gọi hàm insert để chèn vào sau nó.

    d. Xóa các số nguyên tố, các số không phải là nguyên tố -> Tương tự như câu a

    e. Xóa, thêm phần tử đầu tiên -> Bạn chỉ cần gọi hàm delete(first) hoặc insert(first, x) là xong

    f. Xóa các số lẻ -> Tương tự câu a

    g. Xóa 2 phần tử đầu tiên. -> Bạn gọi delete(first) 2 lần là xong
    Rất hi vọng giúp được bạn!

    ps: Cấu trúc dữ liệu trên mình tham khảo trong sách Algorithms in C của Robert Sedgewick, bạn có thể tìm đọc để hiểu rõ ràng hơn!

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    sử dụng danh sách móc nối tạo n số ngầu nhiên cho danh sách liên kết

    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    #include <time.h> (thư viện khai báo thời gian)

    typedef
    struct pointer( dữ liệu kiểi cấu trúc)
    { int so;
    struct pointer *next;
    }
    pointer;

    int random(int num)
    {
    return (int)(((long)rand()*num)/(RAND_MAX+1));
    }
    ( srand(time(NULL)); //dòng này để tạo giá trị seed ngẫu nhiên
    rand(); //dòng này sẽ cho ra một số nguyên ngẫu nhiên từ 0 đến RAND_MAX (được định nghĩa trong file stdlib.h} )

    int main()
    {int i,k,tg,n;
    pointer *ds, *p, *z;( con trỏ )
    printf("
    Nhap so phan tu n = ");
    scanf("%d",&n);
    ds=NULL;

    srand(time(NULL));
    for (i=1;i<=n;i++)
    {
    k=random(100);
    p = (pointer *)malloc(sizeof(pointer)); (malloc cấp phát bộ nhớ động)
    p->so = k;
    p->next=ds;
    ds=p;
    }
    printf("Danh sach lien ket DUOC TAO RA
    ");
    for (p=ds;p;p=p->next)
    printf("%5d",p->so);

    for (p=ds;p->next;p=p->next)
    for (z=p->next;z;z=z->next)
    if (p->so > z->so)
    {
    tg = p->so;
    p->so = z->so;
    z->so = tg;
    };

    printf("
    Danh sach lien ket SAU KHI sap sep
    ");
    for (p=ds;p;p=p->next)
    printf("%5d",p->so);

    getch();
    }



    Mọi người giúp mình code cho phần danh sách móc nối này ạ:
    a. Xóa các số chẵn

    b. Sắp xếp tăng, giảm dần

    c. Thêm số vào cuối danh sách

    d. Xóa các số nguyên tố, các số không phải là nguyên tố

    e. Xóa, thêm phần tử đầu tiên

    f. Xóa các số lẻ

    g. Xóa 2 phần tử đầu tiên.

    Mình mới học và sắp kiểm tra. Cảm ơn mọi người!

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Như câu d, câu f bạn chỉ cần thay đổi biểu thức điều kiện trong vòng while thôi: ở câu a thì là t->next->inf % 2 == 0 (số chẵn) thì bạn thay bằng nguyento(t->next->inf) == 1 (là số nguyên tố) hoặc t->next->inf % 2 == 1 (số lẻ). Hàm số nguyên tố thì bạn có thể tự viết hoặc search trên mạng, cái này có rất nhiều.
    Còn câu g thì bạn làm giống hệt câu e, chỉ có điều là bạn gọi DeleteNext(first) hai lần thay vì một lần như ở câu e.
    Chỉ có vậy thôi, rất đơn giản!

  4. #4
    Mình hi vọng bạn chèn luôn giúp mình từng câu! tạm hiểu vậy mình sẽ hỏi thêm! Sắp thi nên sẽ cố gắng nhập dần! bạn chèn giúp mình vs nhé! rất cảm ơn! làm giúp mình câu a, c, d, e phần xóa, f, g nhé cảm ơn ạ!

    - - - Nội dung đã được cập nhật ngày 18-05-2014 lúc 09:10 AM - - -

    à đây là mình dùng trong C thôi nhé! chưa học C++ nên chưa rõ dc cảm ơn bạn! bạn chèn giúp mình code!

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    cảm ơn bạn nhiều!

  6. #6
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Mình làm các câu a, c, e cho bạn rồi, các câu d, f, g thì hoàn toàn tương tự thôi (câu d và f giống hệt câu a, chỉ khác biểu thức kiểm tra điều kiện)
    Hi vọng giúp được bạn!


    Mã:
    #include<stdio.h>#include<stdlib.h>#include<time.h> #define MAX 100 /*   Giá trị lớn nhất của phần tử trong danh sách là 100   */ typedef int ElementType;  /*   Kiểu dữ liệu của phần tử trong danh sách là int   */struct node   /*   Cấu trúc dữ liệu danh sách   */{    ElementType inf;    struct node *next;}; struct node *first, *last, *t;  /*   first và last là 2 con trỏ làm mốc   */ void ListInit()   /*   Khởi tạo danh sách  */{    first = (struct node *) malloc(sizeof *first);    last = (struct node *) malloc(sizeof *last);    first->next = last;  last->next = last;} int DeleteNext(struct node *t)   /*   Xóa nút ngay sau nút t   */{    struct node *temp = t->next;    t->next = t->next->next;    free(temp);} struct node *InsertAfter(ElementType v, struct node *t)   /*   Chèn một nút mới có giá trị v vào sau nút t   */{    struct node *x;    x = (struct node *) malloc(sizeof *x);    x->inf = v; x->next = t->next;    t->next = x;    return x; } void PrintList(struct node *head)   /*   In ra danh sách   */{    struct node *p;    p = head->next;        while (p != last)    {        printf("%d  ", p->inf);        p = p->next;    }} int main(){    srand(time(NULL));    ListInit();        /*   Tao danh sach n nut co gia tri ngau nhien   */    int n;    printf("n = "); scanf("%d", &n);    t = first;    for (int i = 0; i <= n; i++)        t = InsertAfter(rand() % MAX + 1, t);     /*   a. Xoa cac so chan (cau d. va cau f. lam tuong tu)   */    for (t = first; t != last; t = t->next)    {        while (t->next->inf % 2 == 0)  /*   Neu sau t la mot so chan  */            DeleteNext(t);    }     /*   c. Them so vao cuoi danh sach   */    for (t = first; t != last; t = t->next)        ;   /*   Tim nut cuoi danh sach   */    t = InsertAfter(rand() % MAX + 1, t);  /*  Chen nut moi vao sau nut cuoi   */     /*   e. Xoa phan tu dau tien, cau f. lam tuong tu   */    DeleteNext(first);    /*   e. Them phan tu moi vao sau phan tu dau tien   */    t = InsertAfter(rand() % MAX + 1, first);        return 0;}

  7. #7
    Ngày tham gia
    Sep 2015
    Đang ở
    hà nội
    Bài viết
    0
    Bạn có thể làm tiếp dc ko ạ? cái này mới với mình nên muốn cặn kẽ chi tiết một chút! cảm ơn ạ![IMG]images/smilies/kiss.gif[/IMG]

    - - - Nội dung đã được cập nhật ngày 18-05-2014 lúc 10:46 AM - - -

    cảm ơn bạn đã giúp mình! hj vọng đọc kĩ sẽ rõ ràng

  8. #8
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    cho mình dòng insertafter là như thế nào? mình viết nó báo lỗi dòng này

  9. #9
    Vậy à, bạn có thể cho mình xem chương trình và hình ảnh thông báo lỗi được không?

  10. #10
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    mình dùng codeblock 13.12 chỉ nhập n r không có gì nữa? không biết là do đâu?

 

 
Trang 1 của 2 12 CuốiCuối

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •