30/09/2018, 18:11
Có 2 con trỏ *p, và *q thì p->q và p=q có khác nhau không?
mọi người cho mình hỏi tí: Có 2 con trỏ *p, và *q thì p->q và p=q có khác nhau không vậy ?
Bài liên quan
mọi người cho mình hỏi tí: Có 2 con trỏ *p, và *q thì p->q và p=q có khác nhau không vậy ?
Con trỏ này kiểu gì?
Phải có kiểu con trỏ mới nói được
giả sử cả 2 con trỏ cùng kiểu anh ạ
Em không hiểu con trỏ rồi, nếu con trỏ là kiểu
int
, thìp->q
không tồn tại.Nếu con trỏ kiểu link list (danh sách liên kết) thì
p->q
tồn tại, em đang học link list thì đưa cấu trúc linklist lên anh giải thích thêm.dạ, phần này e đang còn kém, mong anh giải thích rõ hơn ạ
e thấy giá trị của p ở trong node kia luôn không đổi, câu lệnh p->pnext có nghĩa là gì ạ ?
p->pnext
là một phép truy vấn dữ liệu, trong đóp
là con trỏ, trỏ tớistruct node
Struct này code sai rồi
Phải sửa lại thế này
Trong đó
*pnext
là một con trỏ, trỏ tới kiểu dữ liệustruct node
.Quay trở lại vấn đề
p->pnext
tức là câu truy vấn giá trị củapnext
là gì?p=q
là một phép gán đơn giảnCám ơn a Đạt, em đang như trên mây về cái phần này
Lại sai hả anh đạt @ltd
Đúng vậy,
struct <kiểu dữ liệu> <tên biến>;
ví dụ:
struct node *pnext;
Như @Rok_Hoang đã trả lời, đó là vì nó không đúng cú pháp, em code thử chạy thử sẽ biết.
em cũng đang mệt mỏi với phần danh sách liên kết anh @ltd ơi không biết nguyên lý hoạt động của mỗi hàm(tạo Node mới, chèn 1 phân tử vào đầu hoặc cuối danh sách…) nó như thế nào (nhất là con trỏ nó cứ trỏ lung tung, cho dù em cũng nắm được kiến thức con trỏ cơ bản), chỉ biết học thuộc code và bê vô thôi. Hỏi thầy cô thì thầy cô cũng không giải thích kĩ, chỉ nói mặc định nó là như thế và không giải thích được tại sao nó lại như thế. Giờ đang bế tắc không biết phải làm sao?
Xem video hướng dẫn của anh, anh nói rất kỹ mà.
ok để em vào xem. Em quên mất là anh có làm bài hướng dẫn về phần này!
Bạn nên xem series con trỏ của anh Nguyễn Việt Nam Sơn trước khi bước qua phần cấu trúc dữ liệu, vì phần này ứng dụng con trỏ khá nhiều, nếu không nắm được con trỏ thì rất dễ bị tẩu hỏa @@. Dưới đây là code demo về cấu trúc dữ liệu đơn giản, hi vọng giúp được bạn :
mình cũng đang xem phần này của a sơn , nếu bạn hiểu rõ thuật toán link list thì mong bạn giúp đỡ.
ở bước thứ 3 trong code của bạn:
//neu danh sach rong
thì lúc này l.phead=p // cái này mình thấy ok rồi
nhưng l.ptail phải bằng null chứ vì sau khi thêm node này vào thì lúc này danh sach moi chi co 1 node mà thôi thì l.ptail=null chứ ?? sao lại bằng p ?
Khi danh sách rỗng, nếu bạn thêm vào 1 Node thì trong danh sách lúc bấy giờ chỉ có 1 mình Node đó, hay nói 1 cách dễ hiểu, đầu và cuối của danh sách cũng chính là node đó luôn
Mình hiểu thế này :lúc đầu khởi tạo một list l.phead=l.ptail=null; tức là lúc này trong danh sách đã có 2 node nhưng 2 node này không có data, cứ gọi là nodedau và nodecuoi; lúc này con trỏ pnext của nodedau này chưa biết trỏ đến đâu nên gán=null và con trỏ pnext cũng chính là con trỏ l.ptail, 2 con trỏ này là một;
còn cái thằng l.ptail sẽ nằm cố định và có giá trị null;
khi thêm 1 node này (node này có data) thì pnext (hay cũng chính là l.ptail) của nodedau sẽ bằng p; còn pnext của node này sẽ bằng l.ptail.
không biết mình hiểu thế có đúng không ?
Lúc khởi tạo list rỗng, 2 con trỏ pHead và pTail sẽ được tạo nhưng chưa được cấp pháp vùng nhớ để trỏ tới vì vậy sẽ không có 2 node đầu và node cuối đâu như bạn nói đâu. Node thực sự được tạo ra qua hàm NODE* GetNode(int x), hàm này trả về 1 con trỏ node, dữ liệu kiểu int được truyền qua biến x. Sau đó hàm addHead hay addTail có nhiệm vụ đưa con trỏ vào trong danh sách : lúc này con trỏ mới thực sự nằm trong danh sách nè, bạn để ý chỗ hàm addHead (hoặc addTail) có đoạn code như sau :
Con trỏ đầu và cuối của list được sẽ bằng p vì danh sách rỗng, nếu danh sách không rỗng thì bạn xem tiếp phần else.
Và cuối cùng, để dễ hiểu, bạn hình dung những công việc mà mình cần làm với list như sau :
Nếu có gì thắc mắc bạn cứ post tiếp nhé
mình muốn hỏi thêm một chỗ là nếu chỉ tạo 2 node thì ở trong hàm addtail(…)
chỗ else l.ptail->pnext=p;
mình có thể thay bằng lệnh pl.pnext->pnext=p được không ?
vì ở node đầu tiên thì l.phead=l.ptail=p;
e cảm ơn anh ạ, e cũng bắt đầu hiểu rõ hơn rồi
Èo bạn không hiểu rồi, bản chất l.pTail là 1 con trỏ trỏ tới Node cuối, node này chứa 1 con trỏ pNext trỏ tới null. Khi addTail 1 node vào, thì bản thân của node đó sẽ trở thành node cuối (tức là trở thành Tail). Dòng code :
Dòng đầu là cho con trỏ Tail trỏ next tới p (Tail trở thành áp cuối)
Dòng 2 là cho tail là p
Còn bạn nói là thay bằng lệnh p.pnext->pnext = p là không hề có, vì p đang là con trỏ nên sẽ không có toán tử “.” và việc trỏ pnext bằng chính nó không hề đúng (cả về mặt nghĩa cũng như về mặt code). Bạn xem kĩ lại nha