01/10/2018, 01:17

Liên kết danh sách đơn

/* C++ Programming, Example answer, Exercise 2a, Sheet 8  */

/* Author: Rob Miller and William Knottenbelt
   Program last changed: 30th September 2001    */

/* This program creates a linked list of strings, and prints it out 
both forwards and backwards. */ 

#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;

const int MAX_WORD_LENGTH = 80;

/* definition of a node */
struct Node;
typedef Node *Node_ptr;

struct Node
{
	char word[MAX_WORD_LENGTH];
	Node_ptr ptr_to_next_node;
};

/* Function to assign a linked list to "a_node" */
void assign_list(Node_ptr &a_list);

/* Function to assign a new dynamic node variable to "a_node" */
void assign_new_node(Node_ptr &a_node);

/* Function to print the strings in the list "a_node" forwards */
void print_list_forwards(Node_ptr a_node);

/* Function to print the strings in the list "a_node" backwards*/
void print_list_backwards(Node_ptr a_node);

/* MAIN PROGRAM */
int main()
{
	Node_ptr my_list = NULL;

	assign_list(my_list);

	cout << "
THE LIST FORWARDS IS:
";
	print_list_forwards(my_list);

	cout << "

THE LIST BACKWARDS IS:
";
	print_list_backwards(my_list);
	cout << "
";
			
	return 0;
}
/* END OF MAIN PROGRAM */
	
/* DEFINITION OF FUNCTION "assign_list" */
void assign_list(Node_ptr &a_list)
{
	Node_ptr current_node, last_node;
	
	assign_new_node(a_list);
	cout << "Enter first word (or '.' to end list): ";
	cin >> a_list->word;
	if (!strcmp(".",a_list->word))
	{
		delete a_list;
		a_list = NULL;
	}
	current_node = a_list;
	
	while (current_node != NULL)
	{
		assign_new_node(last_node);
		cout << "Enter next word (or '.' to end list): ";
		cin >> last_node->word;
		if (!strcmp(".",last_node->word))
		{
			delete last_node;
			last_node = NULL;
		}
		current_node->ptr_to_next_node = last_node;
		current_node = last_node;
	}
}	
/* END OF FUNCTION DEFINITION */

/* DEFINITION OF FUNCTION "assign_new_node" */
void assign_new_node(Node_ptr &a_node)
{
	a_node = new node;
	if (a_node == NULL) 
	{
		cout << "sorry - no more memory
"; 
		exit(1);
	}
}
/* END OF FUNCTION DEFINITION */

Cho mình hỏi chỗ void assign_new_node(Node_ptr &a_node)
Node_ptr là con trỏ mà truyền thêm & nó có ý nghĩa gì trong hàm đó.

明玉 viết 03:17 ngày 01/10/2018

Pass by reference - truyền bằng tham chiếu nhé.
Cứ nhớ đơn giản là bên trong thay đổi, bên ngoài cũng thay đổi.
Còn bản chất thì nó là trừu tượng hóa cho con trỏ.

Hoan Sò viết 03:26 ngày 01/10/2018

Nhưng a_node là con trỏ nhưng khi tạo bộ nhớ cho nó lại là a_node=new node;
chứ không phải làa_node= new Node_ptr;

明玉 viết 03:19 ngày 01/10/2018

Note_ptr khi biên dịch sẽ được resolve thành Node* (do typedef Node* Note_ptr).
Cho nên new Node là đúng rồi.
Con trỏ cũng là variable, cũng có chỗ lưu trên ram, nên cũng có thể có con trỏ khác, hoặc reference chỉ đến nó.

Hoan Sò viết 03:26 ngày 01/10/2018

Theo minh nghĩ thì Node_ptr &a_node <->Node*&a_node <-> Node a_node
but void assign_list(Node_ptr &a_list) thì cin >> a_list->word; a_list lại là con trỏ

明玉 viết 03:26 ngày 01/10/2018

a_list của bạn cũng là kiểu Node* thôi mà.
Node* & a_node là reference tới vùng nhớ kiểu Node*, vùng nhớ Node* đó mới là con trỏ trỏ đến vùng nhớ kiểu Node nhé.

Bài liên quan
0