Khai báo và sử dụng danh sách liên kết đơn

Mọi người cho em hỏi với. tại sao khi em in ra danh sách liên kết trường hợp để con trỏ *pdau là biến toàn cục thì in ra được. còn trường hợp e để *pdau là trong hàm main()
và truyền vào hàm nhập thì lại không in ra được.

Không in được:

 #include<stdio.h>
#include<stdlib.h>
typedef struct SoNguyen
{
    int dulieu;
    struct SoNguyen *tiep;
}SoNguyen;
void taoDanhSach(SoNguyen *pdau,int x)
{
    SoNguyen *p;
    if(pdau == NULL)
    {
        pdau = (SoNguyen*)malloc(sizeof(SoNguyen));
        p = pdau;
    }
    else
    {
        p = pdau;
        while (p->tiep !=NULL)
            p = p->tiep;
        p->tiep = (SoNguyen*)malloc(sizeof(SoNguyen));
        p = p->tiep;
    }
    p->dulieu = x;
    p->tiep = NULL;

}
void inDanhSach(SoNguyen *pdau)
{
    SoNguyen *p = pdau;
    if(pdau == NULL)
        return;
    while(p != NULL)
    {
        printf("%d\t",p->dulieu);
        p = p->tiep;
    }
}
int main()
{
    SoNguyen *pdau = NULL;
    taoDanhSach(pdau,1);
    inDanhSach(pdau);
    return 0;
}

In được:

#include<stdio.h>
#include<stdlib.h>
typedef struct SoNguyen
{
    int dulieu;
    struct SoNguyen *tiep;
}SoNguyen;
    SoNguyen *pdau = NULL;
void taoDanhSach(int x)
{
    SoNguyen *p;
    if(pdau == NULL)
    {
        pdau = (SoNguyen*)malloc(sizeof(SoNguyen));
        p = pdau;
    }
    else
    {
        p = pdau;
        while (p->tiep !=NULL)
            p = p->tiep;
        p->tiep = (SoNguyen*)malloc(sizeof(SoNguyen));
        p = p->tiep;
    }
    p->dulieu = x;
    p->tiep = NULL;

}
void inDanhSach()
{
    SoNguyen *p = pdau;
    if(pdau == NULL)
        return;
    while(p != NULL)
    {
        printf("%d\t",p->dulieu);
        p = p->tiep;
    }
}
int main()
{

    taoDanhSach(1);
     taoDanhSach(2);
    inDanhSach();
    return 0;
}

Tham trị với tham chiếu thôi :smiley: thêm một sao nữa nhé.

2 Likes

Nhưng tưởng là con trỏ cũng như mảng ấy. chỉ cần cho con trỏ vào là được. chứ không cần truyền cả địa chỉ nữa.

Hi Hậu Kòi.
Khi bạn truyền mảng theo kiểu con trỏ và hàm thì chỉ đọc ghi và vùng nhớ nó trỏ đến nên không vấn đề gì. Nhưng ở đây bạn thay đổi vị trí nó trỏ đến.

1 Like

cảm ơn. mình hiểu rồi

Như 2 vị đại ca trên nói thì bạn đang thay đổi vị trí của con trỏ trỏ đến. Bạn phải sửa thành thế này :point_down:

#include<stdio.h>
#include<stdlib.h>
typedef struct SoNguyen {
	int dulieu;
	struct SoNguyen *tiep;
} SoNguyen;
void taoDanhSach(SoNguyen *(*pdau), int x) {
	SoNguyen *p;
	if(*pdau == NULL) {
		*pdau = (SoNguyen*)malloc(sizeof(SoNguyen));
		p = *pdau;
	} else {
		p = *pdau;
		while (p->tiep !=NULL)
			p = p->tiep;
		p->tiep = (SoNguyen*)malloc(sizeof(SoNguyen));
		p = p->tiep;
	}
	p->dulieu = x;
	p->tiep = NULL;
}
void inDanhSach(SoNguyen *pdau) {
	SoNguyen *p = pdau;
	if(pdau == NULL)
		return;
	while(p != NULL) {
		printf("%d\t",p->dulieu);
		p = p->tiep;
	}
}
int main() {
	SoNguyen *pdau = NULL;
	taoDanhSach(&pdau, 1);
	taoDanhSach(&pdau, 2);
	taoDanhSach(&pdau, 3);
	inDanhSach(pdau);
	return 0;
}

P/s: malloc thì phải nhớ free. :slight_smile:

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?