- truyền thiêu kiểu tham chiếu có nghĩa cái bạn cần truyền có thể có giá trị sau khi nó đi vào hàm xong nó sẽ bị thay đổi bạn tưởng rằng khi bạn truyền tham chiếu có nghĩa bạn dùng con trỏ trỏ vào địa chỉ bạn truyền nếu đó là nếu biến bạn truyền là alias mới có cùng địa chỉ
sau khi các bạn đã tìm hiểu với con trỏ cấu trúc thì chúng ta sẽ đến với việc sử dụng nó cho công việc cụ thể:
các bạn nên nhớ khi làm việc với con trỏ cấu trúc thì chúng ta phải
1: khai báo
2: khởi tạo giá trị ban đầu của 1 cấu trúc có nghĩa là cấp phát cho cấu trúc xong phải khởi tạo các trường của nó
3: đưa giá trị cụ thể vào trong cấu trúc, tùy bạn có thể kết hợp bước này với bước 2 luôn cũng được không sao
4: hủy cấu trúc
danh sách liên kết đơn, stack hay queue chỉ là 1 trong những vấn đề nhỏ trong việc ứng dung con trỏ đây là những kiểu dữ liệu trừu tượng.
danh sách liên đơn là 1 cấu trúc dữ liệu kiểu đệ quy và đương nhiên nó được cấp phát động không cần phải khai báo trước số lượng phần tử sướng chưa
nhằm để đơn giản trong việc trình bày mình chỉ giả định phần giữ liệu trong danh sách chỉ là 1 số kiểu int và 1 con trỏ để giữ các mối liên kết kiểu cấu trúc này được gọi là cấu trúc tự trỏ thì để quản lý danh sách liên kết này bạn cần có thêm 1 con trỏ để quản lý cả danh sách nếu cần thiết bạn có thể sử dụng thêm con trỏ tail để thao tác
chúng ta đến với việc xây dựng danh sách liên kết đơn nào
chúng ta vẫn sẽ tiến hành khai báo 1 struct để lưu giữ
typedef struct node*ref//định nghĩa cái struct này là con trỏ ref, 1 con trỏ ref sẽ quản lý được cái node kiểu này
{
int key;
ref pnext;// con trỏ pnext này sẽ lưu trữ giữ liệu của 1 cái node tiếp theo
}
bây giờ chúng ta sẽ đến với việc cấp phát cho nó và khởi tạo cái node đầu tiên
ref getnode(int k)// hàm này sẽ trả về địa chỉ sau khi được cấp phát xong
{
ref p;//chúng ta cần có 1 con trỏ để trả về địa chỉ sau khi node được khởi tạo xong
p=new ref;//chúng ta cấp phát cho con trỏ p quản lý 8 hay 12 byte tùy hệ điều hành các bạn và p đang trỏ đó
if(p==NULL)
{
//có nghĩa là cấp phát không thành công hệ điều hành không cho con trỏ p vùng nhớ nào cả nếu sử dụng nó sẽ báo lỗi nên chúng ta thoát luôn
exit(0);
}
nếu đã cấp phát thành công chúng ta sẽ khởi tạo cho các trường của nó
p->key=k;
p->pnext=NULL;// bằng NULL vì con trỏ pnext này chưa trỏ đi đâu cả nghĩa chúng ta đang có 1 node riêng biệt chứ chưa đưa nó vào danh sách liên kết
}return p; chúng ta trả về địa chỉ mà chúng ta đã khởi tạo cho nó 1 cái node thành công
}
chúng ta bây giờ đưa nó vào danh sách liên kết nào tùy chúng ta muốn thêm nó vào đâu trong danh sách thì thêm bây giờ chúng ta thêm vào đầu nhé
void addfirst(ref &head,ref tail,int k)//chúng ta cho 2 con trỏ này quản lý danh sách với điều kiên bạn đã khởi tạo cho hai con trỏ này trỏ đến null nếu không chúng ta sẽ không sử dụng được mà đến đây bạn phải sử dụng c++ với biến tham chiếu con trỏ để chúng ta có thể thay đổi vùng mà con trỏ đang trỏ tới và chúng ta khi thêm 1 phần tử vào đầu danh sách không phải trả địa chỉ con trỏ về vì đã có con trỏ head thay chúng ta quản lý
if(head==NULL)//nghĩa là con trỏ đang rỗng
{
head= tail=p;
}
else
{
p=getnode(k);
p->pnext=head//con trỏ pnext của con trỏ p(dùng để nhận địa chỉ mà chúng ta đã khởi tạo cho nó) sẽ trỏ đến vị trí con trỏ head cũ.
head=p;có nghĩa là con trỏ head này sẽ trỏ đến vùng nhớ mà chúng ta sẽ khởi tạo bây giờ chùng ta đã có thêm 1 node mới như hình trên cùng đấy
}
còn việc thêm xóa phần tử rồi giải phòng vùng nhớ, rồi dữ liệu trừu tượng void* hay T chứ không phải là số nguyên nữa mình sẽ trình bày ở phần sau