Hỏi về cấu trúc lệnh trong môn cấu trúc dữ liệu và giải thuật

đây là đoạn code về link list mà lên google gõ ra rất nhiều ,
https://codeshare.io/5R8Wbj
và e có rất nhiều câu hỏi về đoạn code này ,mong mn giúp đỡ ,em học c++ cũng khá .
thứ 1: hàm Getnode ở dòng 14 nó có khác gì hàm Getnode ko hay đơn giản chỉ là khác biệt kiểu trả về
thứ 2: ở dòng 26 khai báo Node
p_new thì nó là 1 con trỏ và *p_new sẽ có thành phần là int data và Node *pnext phải ko ạ ,và *p_new sẽ trỏ tới 1 giá trị khác ,cụ thể là NULL??, p_new đc goi là 1 nốt mới hay chỉ đơn giản gọi là con trỏ ,cái này e thắc mắc nhất ?
thứ 3: lệnh l.phead ở dòng 28 nó sẽ lấy về giá trị của con trỏ phead phải
ko ạ,vậy tại sao nó ko phải = &(*p_new) mà lại là = p_new
thứ 4: code này chạy báo lỗi Exception thrown: read access violation.

i was 0xDDDDDDDD.

If there is a handler for this exception, the program may be safely continued.
thật là biết ởn cuộc đời nếu như e được giải thich hết thắc mắc trên

Thật sự không có hàm tên là *Getnode.[quote=“vinhthang, post:1, topic:57484”]
*p_new đc goi là 1 nốt mới hay chỉ đơn giản gọi là con trỏ thôi.
[/quote]
Con trỏ đúng lí ngoài những chỗ đã trỏ thì chỉ có thể trỏ vào NULL.

Thớt về xem lại phần con trỏ.

1 Like

tra lời cụ thể được ko anh nói vậy ko hiêu được

có ai ko ạ ,anh đạt vào giải thích 1 cách chi tiết từng vấn đề em hỏi được ko ạ

Mình thấy anh ấy trả lời rất dễ hiểu.

Tên hàm chỉ có thể là Getnode, còn kiểu trả về là Node *.

1 con trỏ bất kì hoặc trỏ vào 1 chỗ nào đó, hoặc chẳng trỏ vào chỗ nào cả (NULL). Giống như người ta hỏi “nhà bạn ở đâu”, bạn sẽ chỉ tay vào 1 nhà nào đó cụ thể, hoặc bạn trỏ tay vào bãi đất trống (NULL).

Câu này dễ hiểu nhất.

cái này chỉ đúng cho hàm thôi hay sao a
vd khac: int *p thì int là kieu trả về chứ đâu phải int*

Nếu trả về Node thì tức là trả về rvalue, mà một giá trị tạm không thể lưu trữ nên phải trả về Node* mới đúng, vì con trỏ mới là tạm còn nó trỏ tới một node tồn tại hết chương trình.

Vẫn là int*.

giá trị tạm ko thể lưu trữ là sao ạ

Xem ở đây nhé. https://eli.thegreenplace.net/2011/12/15/understanding-lvalues-and-rvalues-in-c-and-c

Có thể nói, không hiểu rõ lvalue với rvalue của C++ (C++11: move semantic) thì không thể gọi là “sạch nước cản” được :slight_smile:

1 Like

Bạn biết tại sao mình cực kỳ ghét các sách cũ thường ghi là int *a không? Vì nếu như bạn đã quen với một ngôn ngữ quản lý kiểu dữ liệu cực kỳ chặt chẽ như C#, bạn sẽ thấy cực kỳ ngứa mắt, và sửa ngay lại thành int* a. Khi khai báo như thế, a là một biến có kiểu dữ liệu là int*

Đây là cú pháp khai báo của C# nè :slight_smile: (Có thể không chính xác nhưng đại loại thế)

int a;//Khai báo biến kiểu số nguyên
int a = 10;//Khai báo biến a và khởi tạo giá trị
int a = new int();//Khai báo biến a và khởi tạo giá trị với Constructor không tham số.
int a = new int(10);//Khai báo biến a và khởi tạo giá trị với Constructor có tham số (100)
int a = default(int);//Khai báo biến a và khởi tạo giá trị mặc định của kiểu int

int[] a;//Khai báo biến a có kiểu dữ liệu int[] (kiểu mảng số nguyên)
int[] a = new int[10];//Khai báo biến a có kiêu dữ liệu int[] và khởi tạo giá trị, trỏ đến một vùng nhớ kiểu int, kích thước là 10
int[] a = new int[] { 1, 2, 3, 6, 10 };//Khai báo biến a có kiểu dữ liệu int[] và khởi tạo luôn mảng 5 phần tử

int* a, b, c;//Khai báo 3 con trỏ, không giống như C++ phải ghi là int *a, *b, *c;
int* a = new int[10];//Cái này thì giống hệt bên C++, được cái C# thì dùng xong không delete

Ngoài ra, còn có kiểu dữ liệu cấp 2 int**, int[][], int*[], int[]*, bên C# còn có cả kiểu dữ liệu cấp 1 nhưng nhiều chiều (mảng 2 chiều không phải là mảng chứa mảng nhé)

int[,] a = new int[10, 5];//Khai báo và khởi tạo mảng có 2 chiều, một chiều có kích thước 10, một chiều 5
int[,,,,] a;//Khai báo mảng 5 chiều :))
1 Like

Một điều ít người học để ý là:

int* p, q; 
//...
p = q; //lỗi, q không phải con trỏ!
1 Like

Đọc về con trỏ tại đây

Họ sẽ dạy bạn nên dùng style code nào khi khai báo con trỏ.

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