01/10/2018, 12:15

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

rogp10 viết 14:31 ngày 01/10/2018

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ậ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ứ 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ớt về xem lại phần con trỏ.

Vinh viết 14:22 ngày 01/10/2018

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

Vinh viết 14:20 ngày 01/10/2018

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 ạ

HK boy viết 14:29 ngày 01/10/2018

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

Thật sự không có hàm tên là *Getnode.

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

Con trỏ đúng lí ngoài những chỗ đã trỏ thì chỉ có thể trỏ vào NULL.

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).

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

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

Vinh viết 14:29 ngày 01/10/2018

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

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*

rogp10 viết 14:27 ngày 01/10/2018

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ề

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.

vd khac: int *p thì int là kieu trả về chứ đâu phải int*

Vẫn là int*.

Vinh viết 14:26 ngày 01/10/2018

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

rogp10 viết 14:29 ngày 01/10/2018

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

Trần Hoàn viết 14:25 ngày 01/10/2018

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è (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 :))
rogp10 viết 14:29 ngày 01/10/2018

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

int* p, q; 
//...
p = q; //lỗi, q không phải con trỏ!
Dark.Hades viết 14:16 ngày 01/10/2018

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

Learn C++ – 11 Jul 07

6.7 — Introduction to pointers

In lesson 1.3 — a first look at variables, we noted that a variable is a name for a piece of memory that holds a value. When our program instantiates a variable, a free memory address is auto…

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

Bài liên quan
0