Em chưa hiểu bản chất của câu lệnh khai báo danh sách liên kết đơn

l.dau là con trỏ trỏ vào phần tử đầu tiên của 1 dslk, ko phải là con trỏ đầu tiên của dslk. Tưởng tượng dslk (đơn) chứa n phần tử là 1 nhóm n người:
người thú 1 sẽ biết người thứ 2 là ai (người thứ 1 có con trỏ tới người thứ 2)
người thứ 2 sẽ biết người thứ 3 là ai (người thứ 2 có con trỏ tới người thứ 3)
người thứ 3 sẽ biết người thứ 4 là ai (người thứ 3 có con trỏ tới người thứ 4)

người thứ n-1 sẽ biết người thứ n là ai (người thứ n-1 có con trỏ tới người thứ n)

để biết tất cả mọi người trong dslk này thì bạn chỉ cần biết người thứ 1 là ai, hay cần có con trỏ tới người thứ nhất.

2 Likes
void themdau(LIST &l,NODE *p)
{
           if(l.dau==NULL)//kiểm tra danh sách(L) rỗng 
                  l.dau=l.cuoi=p; //cho con trỏ dau và con trỏ cuoi trỏ vào Node p luôn
           else //danh sách(L) đã có phần tử
           {
                  p->next=l.dau; //cho biến thành phần(*next) của p trỏ vào Node nằm đầu danh sách(L)
                  l.dau=p;        //gán ngược trở lại Node của đầu danh sách là p
           }
}

sao cái l.dau là 1 con trỏ lại =được NODE p ?

NODE * p

p là con trỏ tới NODE. Có dấu * kìa.

1 Like

l.dau=p; //gán ngược trở lại Node của đầu danh sách là p

cái này phải là // gán ngược trở lại con trỏ đầu danh sách là p đúng k ??
mà nếu p là con trỏ thì sao lại có next ở đây hả bạn ơi ?

Vạy chứ bạn khai báo

struct LIST
{
	NODE *dau; 	
        NODE *cuoi;

};

dau là 1 biến con trỏ trỏ tới kiểu dữ liệu NODE sao nó lại không trỏ được tới p

1 Like

p->next tức là (*p).next, mà (*p) chính là phần tử mà p trỏ tới. (*p).next tức là truy cập biến next của phần tử mà p trỏ tới.

nó trỏ tới *p chứ ko phải trỏ tới p. p ở đây là con trỏ rồi :smile:

1 Like

à à đã thông rồi thanks you 2 bạn nhiều :smiley:

Bạn ơi cho mình hỏi là NODE* next và NODE *next có khác j nhau không hay là 1 ?

2 cách khai báo trên là giống nhau

1 Like

bạn giải thích cái phần else = hình vẽ cho mình cái mình k hiểu 2 dòng đó

void themcuoi(LIST &l,NODE *p)
{
	if(l.dau=NULL) l.dau=l.cuoi=p;
	else 
	{
		l.cuoi->next=p;
		l.cuoi=p;
	}
}

Cho mình hỏi là tất cả dấu mũi tên màu đỏ trong hình đều là con trỏ NEXT đúng k bạn ???

Cho mình hỏi ké:
tại sao cái hàm thêm đầu của mình cũng viết gần giống bạn này nhưng void InsertFirst(list l,node* p) thì không báo lỗi mà như hình vẽ lại báo lỗi là sao vậy ?

con trỏ C bá đạo. Hôm mình thi môn này mình đã phải học thuộc code.:sweat_smile:

1 Like

bạn phải truyền con trỏ tới list l: list *pList vì pList->pHead có thể thay đổi giá trị. Truyền list l là truyền tham trị của l rồi

vậy tại sao mình dùng list &l thì nó lại báo lỗi trong khi bài của bạn Dung_Nguyen3 lại đúng (mình xem video hướng dẫn thì cũng thấy dùng &)
như vậy list &l và list *l là như nhau à?

C đâu có truyền tham chiếu, làm sao viết list& l được

vậy bài trên là dùng C++ à. nếu vậy cho mình hỏi &l và *l có khác nhau không?
Như vậy bài trên mình phải dùng list *l à ?

dùng list* l. Mỗi lần insert phải gán p->pNext = l->pHead rồi l->pHead = p. Ngoài ra còn phải kiểm tra nếu l->pTail == NULL thì phải gán l->pTail = p nữa.

Mình đã làm giống bạn nhưng bài của mình vẫn bị lỗi không hiểu làm sao. Bạn vào xem giúp mình với

nhiều lỗi quá… hầu như hàm nào cũng sai ~.~

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