@ElinMyers

Как происходит передача списка в функцию через параметр?

Доброго времени суток, я давно бьюсь над задачей создания связного списка, и не получается добавлять элементы.
Суть в том, что функция добавления элемента работает правильно, но как только происходит выход из функции списка как-бы и нет...
И так:
Вот структура элемента:
struct Node
{
	string word;
	Node* next;
};

Есть функция инициализации списка:
Node* init(string str)
{
	Node* item = new Node;
	item->word = str;
	item->next = NULL;
	return item;
}

Допустим список инициализирован(с ней проблем нет), и я хочу добавить новый элемент вызывая следующую функцию:
void AddNode(Node* pfirst, string str)
{
	Node *tmp, *item = new Node;
	item->word = str;
	item->next = NULL;

	tmp = pfirst;
	while (tmp->next != NULL)
		tmp = tmp->next;
	tmp->next = item;
	delete tmp;
}


Согласно отладчику:
Список передаётся в функцию и добавляется новый элемент, но после завершения этой функции список превращается в мусор.
Вот так выглядит Main:
int main()
{
	Node* head = NULL;

	head = init("One");

	AddNode(head, "Two");
	
	PrintList(head); // Функция печати списка

	return 0;
}


Собсна вопрос: при передачи списка в функцию - это тот же список или новый, который просто так не вернётся указателю head? Мне что, нужно возвращать список return'ом? Как это реализовать?
Весь код:
spoiler

struct Node
{
	string word;
	Node* next;
};

Node* init(string str)
{
	Node* item = new Node;
	item->word = str;
	item->next = NULL;
	return item;
}

void AddNode(Node* pfirst, string str)
{
	Node *tmp, *item = new Node;
	item->word = str;
	item->next = NULL;

	tmp = pfirst;
	while (tmp->next != NULL)
		tmp = tmp->next;
	tmp->next = item;
	delete tmp;
}

void PrintList(Node* pfirst)
{
	Node* tmp = pfirst;
	while (true)
	{
		cout << tmp->word << endl;
		if (tmp->next == NULL) break;
		tmp = tmp->next;
	}
}

int main()
{
	Node* head = NULL;

	head = init("One");
	AddNode(head, "Two");
	return 0;
}



Не предлагайте создание списка классом, мне нужно выполнить именно так. Спасибо!
  • Вопрос задан
  • 389 просмотров
Решения вопроса 1
@towin
У вас все правильно кроме того что не нужно вызывать
delete tmp;
в функции AddNode(). Так вы удаляете предпоследний элемент списка, а это не нужно делать.
Из AddNode возвращать ничего не нужно, вы передаете ей в параметрах указатель, и структуру, на который он указывает, модифицируете.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы