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


#Đăng ký khóa học C++ cơ bản 2016 ( NEW ) tại đây :
#Thông tin về khóa học xem tại đây :

-Sự khác biệt giữa 2 khóa học cũ và mới :
+Khóa học C++ cơ bản 2016 là khóa học mới, được đầu tư nhiều hơn từ nội dung, phương pháp học, cách học hiệu quả.
+Trong khóa học còn có nhiều kiến thức mới như thực hành trên HackerRank, thực hành trên Codefights và Đạt nghĩ mọi người nên học khóa học mới, bởi vì đây là kiến thức mới, phù hợp với hiện tại… Mặt khác âm thanh cũng tốt hơn nhiều so với khóa học cũ giúp đỡ việc lắng nghe và hiểu được tốt hơn.

4 Likes

Đang quất tới bài này. Chưa hiểu (tạm thời chưa cần hiểu nhưng nếu có thể giải thích thì mình xin cảm ơn rất nhiều :smiley: ) cái _itoa dưới đây có tác dụng gì.
Khi biên dịch code thì VS2013 báo lỗi:Mình thay thế bằng _itoa_s như ử dưới có được không vậy nhỉ?

Giúp mình với các bạn ơi. :stuck_out_tongue:

3 Likes

Được, _itoa_s là phiên bản an toàn của itoa. Wow, code nhìn đẹp quá :smile:

http://msdn.microsoft.com/en-us/library/0we9x30h.aspx

2 Likes

Uhm okie bạn :smiley:

2 Likes

À, để a làm các ứng dụng sử dụng Qt đó mà. Anh xài visual studio quen rồi nên anh cài cái plugin đó vào để viết code Qt cho tiện :smiley:

2 Likes

Hình như dùng _itoa , printf, strcpy… visual studio đều báo cái warning này_CRT_SECURE_NO_WARNINGS.
Sửa lại phiên phản an toàn của mấy hàm đó thì build OK nhưng chương trình hay crack vì bộ đệm quá small. Mấy cái này rắc rối phết, mong rằng có ai pro viết một bài về mấy hàm này .

1 Like

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:

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