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

c

(Hậu Kòi) #1

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;
}

(rogp10) #2

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


(Hậu Kòi) #3

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.


(Tao Không Ngu.) #4

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.


(Hậu Kòi) #5

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


(Sherly1001) #6

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:


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