[Video] C++ Bài 46 - Link List - Chuẩn bị class SinhVien

Source Code Bài 46 - 52 Phần Linked_List đây nhé :blush:
:stuck_out_tongue:

2 Likes

Nice, ở đâu ra vậy Tùng @_@

1 Like
for (index = from->Next(); index->Next() != 0; index = index->Next())
{
    if (index->Mssv() == mssv)
    {
        RemoveSinhVien(previous, index);
        break;
    }
    previous = index;
}

anh Đạt giải thích giúp em lệnh for này nha. index = index->Next() nghĩa là sao?

1 Like

I moved 7 posts to a new topic: Làm sao để Visual Studio nhắc lệnh tốt hơn?

Giờ em đã hiểu vấn đề rồi :), do lúc trước em không hiểu LinkList nên không giải thích được.

2 Likes

I moved a post to a new topic: Cách cấu hình compiler GNU hoặc MinGWanBC cho notepad++?

cho em hỏi cái này.
Em có 1 định nghĩa struct như sau

typedef struct SV
{
 int STT;
 SV * next;
}

và em có khai báo head và danh sách sinh viên để lưu vị trí đầu tiên của danh sách

SV * SinhVien;
SV * head;

1/Tại sao SinhVien phải cấp phát một vùng nhớ thì thằng head mới có thể lưu được địa chỉ của sinh viên đầu tiên? Theo em nghĩ thì SinhVien khi khai báo đã có địa chỉ rồi nhưng nó chưa trỏ tới một nhớ nào hết thôi. Vậy tại sao head lại không trỏ đến thằng SinhVien được, hay head phải trỏ đến vùng nhớ luôn?
2/Tại sao khi em làm như thế này thì không được?

SinhVien=SinhVien->next;
Capphat(SinhVien); //hàm chỉ cấp phát một vùng nhớ kiểu SV

Mà phải làm như thế này

Capphat(SinhVien->next);
SinhVien=SinhVien->next;

Em cấp phát như thế nào? Điểm này anh không rõ em đang làm gì.

Cho anh xem code của hàm cập nhật?

1 Like
void Capphat(SV *&a)
{
	a = (SV *)malloc(sizeof(SV));
}

Cập nhật?

đây là code hôm qua em sửa cho bạn Học, thấy kì kì. 2 chỗ em hỏi nằm ở dòng 35-37 và 58-59. @ltd

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#define MLEN 20


typedef struct PET 
{
	char type[MLEN]; 
	char name[MLEN]; 
	int HP; 
	int attack; 
	int defense;
	int chisophu;
	int nSkill; 
	char** skill;
	PET * next;
};
typedef struct PET P;


void Capphat1(P *&DanhSach)
{
	DanhSach = (P *)malloc(sizeof(P));
}
void Capphat2(char **&Skill)
{
	Skill = (char **)calloc(4, sizeof(char));
	for( int i = 0 ; i < 4 ; i++)
		Skill[i] = (char *)calloc(19,sizeof(char));
}
void main()
{
        // điểm thứ 1
	P *a;
	Capphat1(a);
	P *head;
        //
	head=a;
	int i;
	FILE *DS = fopen("test.txt","rt");
	while ( !feof(DS) )
	{
		fscanf(DS , "%s ", a->name);
		fscanf(DS , "%s ", a->type);
		fscanf(DS , "%d ", &a->HP);
		fscanf(DS , "%d ", &a->attack);
		fscanf(DS , "%d ", &a->defense);
		fscanf(DS , "%d ", &a->chisophu);
		fscanf(DS , "%d ", &a->nSkill);
		Capphat2(a->skill);
		for (i=0;i<4;i++)
			fscanf(DS ,	"%s ", a->skill[i]);
		if (feof(DS))
			a->next=NULL;
		else
		{ //điểm thứ 2
			Capphat1(a->next);
a=a->next;
		}
	}
	fclose(DS);
	a=head;
	while (a!=NULL)
	{
		printf("\n%s", a->name);
		printf("\n%s", a->type);
		printf("\n%d", a->HP);
		printf("\n%d", a->attack);
		printf("\n%d", a->defense);
		printf("\n%d", a->chisophu);
		printf("\n%d", a->nSkill);
		for (i=0;i<4;i++)
			printf("\n%s ", a->skill[i]);
		a=a->next;
	}
	getchar();
	getchar();
}

Chỗ này là sao nhỉ?

SinhVien phải cấp phát một vùng nhớ

Có phải em muốn nói "Cấp phát một vùng nhớ cho con trỏ SV * SinhVien;?

Thì thằng Head mới có thể lưu được địa chỉ của sinh viên đầu tiên?"

Là sao nhỉ, head lưu như thế nào? địa chỉ nào của sinh viên?

SinhVien là con trỏ, vì là con trỏ thì nó có địa chỉ, nhưng mà đó là địa chỉ của con trỏ. Con trỏ là biến mà lưu địa chỉ của biến khác.

Em hỏi địa chỉ của sinh viên là em đang nói tới địa chỉ nào? Câu hỏi của em tối nghĩa quá. Hay em gửi toàn bộ code lên cho anh đọc thử.


OK, em đã gửi code thì anh đọc và hiểu rồi. Để anh giải thích từng điểm một.

    P *a;
    Capphat1(a);
    P *head;
    //
    head=a;

a là con trỏ.
head cũng là con trỏ.
con trỏ chứa địa chỉ của biến khác.

=> head = a có nghĩa là gán địa chỉ mà a đang giữ cho head. Kể từ bây giờ, ahead cùng trỏ tới cùng một địa chỉ.

Hi vọng giải thích thế này giải thích được cho em.

2 Likes

tức là head sẽ không trỏ đến a mà head sẽ trỏ tới vùng nhớ mà a trỏ tới đúng không anh? Vì thằng a chưa trỏ tới đâu nên head cũng không thể trỏ đến được?
còn ở điểm thứ 2. Thì cũng tương tự đúng không anh.

2 Likes

Đúng vậy.

Mới tạo ra a trỏ tới vùng nhớ lung tung, tầm bậy, ko kiểm soát được.

Đúng vậy.

2 Likes

Source code danh sách liên kết sinh viên thao tác với tập tin .347 dòng ( đã lược bỏ bớt) :wink:

Các bạn chú ý thao tác trên DSLK thì làm việc ở 2 NODE đầu (Head) và NODE cuối(Tail) thì phải cẩn thận không danh sách sẽ bị đứt đoạn.

Di chuyển sang topic mới phù hợp hơn Một số thắc mắc về con trỏ

1 Like

làm sao để đưa thư viện vào phần mềm visual studio 2013
hướng dẫn của bạn trên visual studio 2010
khi tui thực hiện trên phần mềm code block thì được nhưng ở visual studio thì nó không có số 1, 2 ,3
như ở codeblock và không compliler
làm sao tui có thể đưa vào được

Hmm trường hợp này lạ nhỉ, @minhtranlenguyen gửi code lên xem thử? Code bên Visual Studio 2013 ấy.

1 Like

không phải code mà phần mềm tui viết ngay từ bài hướng dẫn đầu tiên của bạn về C++
ở C dễ hơn tui gõ bình thường hơn khi dùng visual studio

bài hướng dẫn C của bạn dễ hiểu hơn còn C ++ thì ở codeblock không thể dùng một số tính năng như visual studio được

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