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]
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
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.C Code:
p = l1->pHead; while (p!=NULL) { addHead(&l3,p); // sai : l3 đang là con trỏ không cần &l3 p = p->pNext; }
Do đó bạn này phải làm như sau
__________________________________________________ __________________________________________________C Code:
void uniteList (List*l3, List* l1, List*l2) { Node* p ; p = l1->pHead; while (p!=NULL) { Node *temp = getNode(p->key); addHead(l3,temp); p = p->pNext; } p = l2->pHead; while (p!=NULL) { Node *temp = getNode(p->key); addHead(l3,temp); p = p->pNext; } }
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.