PDA

View Full Version : Đoạn code về linked trên C bị lỗi khi build trên Dev C++. Xem giúp mình



birthis
06-05-2010, 10:44 AM
Có ai biết đoạn chương trình sau sao mà bị lỗi không? Giúp mình với.
Mình chạy bằng DevC 4.9.9.2 nhưng sau khi dịch và chạy thì bị lỗi.

///////////////////////////////////
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
float factor;
int exp;
node *next;
};
node *Insert_ToHead(node *L,float factor,int exp);
int main()
{
node *L=NULL;
float x;
int y;
Insert_ToHead(L,12,13);
x=L->factor;
y=L->exp;
printf("\n %f %d",x,y);
getch();
}
node *Insert_ToHead(node *L,float factor,int exp)
{
node *temp;
temp=(node *) malloc(sizeof(node));
temp->factor=factor;
temp->exp=exp;
temp->next=L;
L=temp;
return L;
}
////////////////////////////////

nammae
06-05-2010, 11:42 AM
Lỗi của bạn là ở chỗ bạn không cập nhật lại vị trí của con trỏ L.
Mình nghĩ nên sửa là:


int main()
{
node *L=NULL;
float x;
int y;
L = Insert_ToHead(L,12,13); ////
x=L->factor;
y=L->exp;
printf("\n %f %d",x,y);
getch();
}

Ngoài ra mình nghĩ bạn cũng nên thêm thao tác giải phóng bộ nhớ đã được cấp phát.

birthis
06-05-2010, 12:02 PM
Uh mình đã thử. Và chạy được rồi. Cảm ơn bạn.
Nhưng mình cũng có thắc mắc là nếu ta không sử dụng trả về :
node *Insert_ToHead(node *L,float factor,int exp)
mà thay bằng:
void Insert_ToHead(node *L,float factor,int exp)
thì vẫn bị lỗi.

nammae
06-05-2010, 12:23 PM
Vì bản chất của hàm Insert_ToHead () của bạn là:
Đầu tiên bạn truyền vào bản sao của con trỏ L. Ở trong hàm Insert_ToHead () bản sao này bị thay đổi vị trí.
Sau khi kết thúc hàm, bản sao này bị thu hồi.
Còn bản chính là con trỏ L thì vẫn không thay đổi vị trí (trong trường hợp này vẫn L trỏ vào NULL vì bạn gán ban đầu L = NULL)
Nếu bạn muốn hàm Insert_ToHead () trả về kiểu void thì tốt nhất là thay đổi vị trí của nó ở trong hàm luôn (bằng cách truyền vào tham chiếu trên C++ hoặc con trỏ trên C)


void Insert_ToHead(node** L, float factor, int exp)
{
node *temp;
temp=(node *) malloc(sizeof(node));
temp->factor = factor;
temp->exp = exp;
temp->next = *L;
*L = temp;
}

Lời gọi hàm trong hàm main () sẽ là:


Insert_ToHead(&L,12,13); // them toan tu & truoc L

birthis
06-05-2010, 01:17 PM
uh. Đã hiểu. Cảm ơn bạn nhiều.