30/09/2018, 19:56

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

#include <stdio.h>
#include <conio.h>

struct sinhvien
{
	int maduan;
	char tenduan[20];
	char diadiem[30];
	float tongtien;
};
struct NODE
{
	sinhvien info;
	NODE *next;
};
struct LIST
{
	NODE *dau;
	NODE *cuoi;
};
NODE *GETNOT(sinhvien x)
{
	NODE *p;
	p=new NODE;
	p->info=x;
	p->next=NULL;
	return p;
}
void nhap(LIST &l)
{
	l.dau=l.cuoi=NULL;
}

ai giải thích cho em từng dòng cái code trên với và chú ý giải thích phần này cho em với

void nhap(LIST &l)
{
	l.dau=l.cuoi=NULL;
 }

THANKS các anh chị và các bạn nhiều

Ngô Doãn Tuấn viết 22:05 ngày 30/09/2018

ai giải thích cho em từng dòng cái code trên với và chú ý giải thích phần này cho em với

Bạn yêu cầu thật bá đạo @@

void nhap(LIST &l){ l.dau=l.cuoi=NULL;}

Phần này gọi tới l.dau,.cuối và gán giá trị NULL cho nó.
Giá trị NULL tức là gì thì hẳn bạn biết rồi đấy.
Còn phần LIST &l hẳn cũng phải rõ rồi nhỉ

Dương Nguyễn Văn viết 21:57 ngày 30/09/2018

theo minh thầy đó là hàm khởi tạo danh sách chứ. bạn đặt tên “nhap” nghe nguy hiểm quá

chazo1994 viết 21:58 ngày 30/09/2018

Bạn kiếm cuốn sách cấu trúc dữ liệu và giải thuật về đọc sẽ hiểu rõ và kỹ. chứ giải thích code thì bạn không áp dụng được vào các tính huống khác đâu. tập trung học code đừng lo ra sản phẩm vội

chazo1994 viết 22:03 ngày 30/09/2018

Bạn có thể tham khảo hai cuốn này
http://www.doko.vn/tai-lieu/cau-truc-du-lieu-va-giai-thuat-1747586

http://monhoc.vn/tai-lieu/giao-trinh-cau-truc-du-lieu-va-giai-thuat-917/

Interns viết 22:02 ngày 30/09/2018
struct sinhvien
{
	int maduan;
	char tenduan[20];
	char diadiem[30];
	float tongtien;
};

sinhvien là một kiểu dữ liệu nó giống nhưint, char, float ,… chỉ khác là nó đa năng hơn có thể chứa nhiều kiểu dữ liệu khác nhau giống như 1 cái box chứa bánh, kẹo,…

struct NODE
{
	sinhvien info; //khai báo biến info có kiểu dữ liệu là sinhvien
	NODE *next; //khai báo biến con trỏ next trỏ tới kiểu dữ liệu NODE
};

NODE cũng tương tự như sinhvien

struct LIST
{
	NODE *dau; //khai báo con trỏ có tên là dau trỏ tới kiểu dữ kiệu Node
	NODE *cuoi; // khai báo con trỏ có tên là cuoi trỏ tới kiểu dữ kiệu Node

};

NODE *GETNOT(sinhvien x)
{
	NODE *p; //khai báo biến con trỏ p trỏ tới kiểu dữ liệu Node
	p=new NODE;//cấp phát cho p 1 vùng nhớ 
	p->info=x; //gán giá trị 1 biến thành phần(info) của p là x 
	p->next=NULL; //gán giá trị biến thành phần(next) của p trỏ tới NULL
       //xem lại cấu trúc của 1 Node để hiểu rõ câu lệnh ở trên
	return p;       //trả về 1 biến con trỏ có kiểu dữ liệu là Node
}

void nhap(LIST &l) //tham số là 1 biến l có kiểu dữ liệu là LIST
{
	l.dau=l.cuoi=NULL; //cho biến thành phần (dau, cuoi) của biến l = NULL
       //xem lại cấu trúc của 1 LIST để hiểu rõ câu lệnh trên
}

TÓM LẠI:

  • Để hiểu link list thì bạn phải hiểu rõ cách truy cập các thành phần của biến bình thường kiểu struct, biến con trỏ kiểu struct (goolge)

  • Phải biết debug để xem chương trình chạy từng bước và kết quả ra như thế nào

Dung Nguyen viết 22:07 ngày 30/09/2018

Mình học mà người ta dạy sơ sài quá, giáo viên cứ giảng mà học sinh cứ ngồi chăm chú nghe mà k vào nổi chữ nào. Cảm ơn bạn rất nhiều !

Dung Nguyen viết 22:03 ngày 30/09/2018

Bạn giải thích rất dễ hiểu mình đã hiểu phần trên. bạn có thể giải thích nốt code này cho mình với được k

void themdau(LIST &l,NODE *p)
{
	if(l.dau==NULL)	l.dau=l.cuoi=p;
	else
	{
		p->next=l.dau;
		l.dau=p;
	}
}
Dung Nguyen viết 22:09 ngày 30/09/2018

Thì mình k hiểu j ms nhầm lẫn kiểu đó đấy. Giờ thì mình nhìn lại thấy mình nguy hiểm kinh khủng :))

Interns viết 22:02 ngày 30/09/2018
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
           }
}

Từ đây bạn có thể suy luận ra trường hợp thêm giữa, thêm cuối, và xoá…
Có gì thắc mắc thì cứ lên đây hỏi nhe

Dung Nguyen viết 21:56 ngày 30/09/2018

cái l.dau như hình bạn vẽ thì nó là node đầu tiên trong danh sách liên kết à? Hay nó chỉ là con trỏ đầu tiên của 1 danh sách liên kết ???

viết 21:57 ngày 30/09/2018

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.

Dung Nguyen viết 22:00 ngày 30/09/2018
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 ?

viết 22:04 ngày 30/09/2018

NODE * p

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

Dung Nguyen viết 22:11 ngày 30/09/2018

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 ?

Interns viết 21:56 ngày 30/09/2018

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

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

viết 22:04 ngày 30/09/2018

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

Dung Nguyen viết 22:09 ngày 30/09/2018

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

Dung Nguyen viết 22:07 ngày 30/09/2018

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

Interns viết 22:02 ngày 30/09/2018

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

Dung Nguyen viết 21:56 ngày 30/09/2018

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;
	}
}
Bài liên quan
0