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

Đề tài: Lỗi về hàm nối 2 danh sách liên kết - Help me!

  1. #1
    Ngày gia nhập
    12 2007
    Bài viết
    11

    Mặc định Lỗi về hàm nối 2 danh sách liên kết - Help me!

    Bài này mình nối 2 danh sách liên kết đơn lại (chỉ cần nối dc, ko quan tâm thứ tự các phần tử ), chương trình viết trên Code::Block., compiler ko báo lỗi nhưng ko chạy. Các bạn giúp mình với!

    [CODE]
    #include <stdio.h>
    #include <stdlib.h>

    typedef struct tagNode
    {
    int key;
    struct tagNode *pNext;
    } Node;

    typedef struct tagList
    {
    Node* pHead;
    Node* pTail;
    } List;

    void initialize(List* l)
    {
    l->pHead = NULL;
    l->pTail = NULL;
    }

    Node* getNode(int x)
    {
    Node* p;
    p = (Node*)malloc(sizeof(Node));
    if(!p)
    printf("\nKhong du bo nho");
    p->key = x;
    p->pNext = NULL;
    return p;
    }

    void addHead (List*l, Node* p)
    {
    if(l->pHead == NULL)
    {
    l->pHead = p;
    l->pTail = l->pHead;
    }
    else
    {
    p->pNext = l->pHead ;
    l->pHead = p;
    }
    }


    void processList (List l) // HAM IN RA DSLK
    {
    Node* p;
    p = l.pHead;
    while (p)
    {
    printf("%d ",p->key);
    p=p->pNext;
    }
    }

    // HAM NOI 2 LIST, KHONG CAN QUAN TAM THU TU, MIEN LA NOI DUOC
    void uniteList (List*l3, List* l1, List*l2)
    {

    Node* p;
    p = l1.pHead;
    while (p!=NULL)
    {
    addHead(&l3,p);
    p = p->pNext
    }
    p = l2.pHead;
    while (p!=NULL)
    {
    addHead(&l3,p);
    p = p->pNext;
    }
    }

    int main ()
    {
    List l1, l2,l3;
    Node* p;
    int x;
    initialize (&l1);
    initialize (&l2);
    initialize (&l3);
    do
    {
    printf("\nThem node, x = ");
    scanf("%d",&x);
    if(x>0)
    {
    p = getNode(x);
    addHead(&l1,p);
    }
    else
    break;
    } while (x>0);
    printf("\nList l1: \n\n");
    processList(l1);
    printf("\n");

    do
    {
    printf("\nThem node, x = ");
    scanf("%d",&x);
    if(x>0)
    {
    p = getNode(x);
    addHead(&l2,p);
    }
    else
    break;
    } while (x>0);
    printf("\n\nList l2: \n\n");
    processList(l2);

    uniteList(&l3,l1,l2);

    processList(l3);
    return 0;
    }
    [CODE]

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

    Bài này bạn sai nhiều lỗi quá.
    Trong hàm main trước:
    bạn khai báo : void uniteList (List*l3, List* l1, List*l2) mà hàm main bạn để uniteList(&l3,l1,l2); phải để là uniteList(&l3,&l1,&l2);
    Trong hàm uniteList(...) bạn để tham số là List * l mà bạn dùng p = l1.pHead; là không được . Phải dùng p = l1->pHead;
    Trong hàm uniteList bạn không thể viết thế này được
    C Code:
    1. p = l1->pHead;
    2. while (p!=NULL)
    3. {
    4.         addHead(&l3,p); //  sai : l3 đang là con trỏ không cần &l3
    5.         p = p->pNext;
    6. }
    Vì p đang là con trỏ giữ địa chỉ của l1->pHead khi vào hàm addHead của l3 thì p->pNext của nó sẽ bị thay đổi. tại lần addHead thứ 2 trong hàm addHead l3 bạn sẽ thấy p->pNext = l3->pHead. do đó khi ra khỏi hàm này giá trị đó vẫn không đổi. và bạn lấy lại p = p->pNext thì nó sẽ cứ lặp vô tận không bao giờ thoát ra được khỏi vòng lặp 1.
    Do đó bạn này phải làm như sau
    C Code:
    1. void uniteList (List*l3, List* l1, List*l2)
    2. {
    3.    
    4.     Node* p ;
    5.     p = l1->pHead;
    6.     while (p!=NULL)
    7.     {
    8.         Node *temp = getNode(p->key);
    9.         addHead(l3,temp);
    10.         p = p->pNext;
    11.     }
    12.     p = l2->pHead;
    13.     while (p!=NULL)
    14.     {
    15.         Node *temp = getNode(p->key);
    16.         addHead(l3,temp);
    17.         p = p->pNext;
    18.     }
    19. }
    __________________________________________________ __________________________________________________

    Không có gì là khó tưởng tượng

    ______________________ _______________________

    Một ý tưởng hay làm đổi thay thế giới

    __________________________________________________ ______________________________
    Đã được chỉnh sửa lần cuối bởi thanhluan07 : 08-06-2008 lúc 03:29 PM.

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

  1. Hướng dẫn Biểu diễn thích hợp bằng danh sách liên kết đơn hoặc danh sách liên kết kép
    Gửi bởi maitrung trong diễn đàn Thủ thuật, Tutorials CTDL & Giải thuật
    Trả lời: 3
    Bài viết cuối: 04-08-2012, 08:01 PM
  2. Cấu trúc dữ liệu Cách tạo danh sách liên kết mới từ danh sách liên kết đã cho như thế nào?
    Gửi bởi giacmo1612 trong diễn đàn Thắc mắc CTDL & Giải thuật
    Trả lời: 2
    Bài viết cuối: 30-11-2011, 04:43 PM
  3. Nhập và xuất danh sách liên kết lồng danh sách liên kết?
    Gửi bởi nvluong_it 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: 22-04-2011, 11:30 AM
  4. Lập trình C Danh sách liên kết - Xử lý danh sách liên kết trong lập trình C
    Gửi bởi phucduan 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: 08-11-2010, 10:25 PM
  5. Danh sách liên kết, code nhập danh sách sinh viên có lỗi làm sao sửa?
    Gửi bởi acmilan 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: 10-04-2009, 08:24 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