Форум программистов, компьютерный форум CyberForum.ru

Односвязные списки: нужно ли при выходе из функции возвращать голову? - C++

Восстановить пароль Регистрация
 
Binjo
4 / 1 / 0
Регистрация: 14.10.2012
Сообщений: 22
08.06.2014, 09:23     Односвязные списки: нужно ли при выходе из функции возвращать голову? #1
Здравствуйте.
Верю, что когда-то здесь на этот вопрос давался ответ, но я не нашел.
Скажите, пожалуйста, вот у меня изначально голова указывает на NULL.Чтобы добавить элемент в конец я прохожу по списку до конца,затем выделяю память под новый элемент,делаю указатель на него от элемента,который был последним,и указываю на Null. Вопрос в следующем:мне нужно при выходе из функции возвращать голову или нет?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.06.2014, 09:23     Односвязные списки: нужно ли при выходе из функции возвращать голову?
Посмотрите здесь:

C++ Односвязные списки
Односвязные списки C++
C++ Односвязные списки С++
Односвязные списки C++
C++ Односвязные списки (функции обращения списка)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
08.06.2014, 12:50     Односвязные списки: нужно ли при выходе из функции возвращать голову? #2
Вы описали функцию добавления элемента в список. Зачем из нее что-то возвращать?
Можно лишь модифицировать такую функцию, просто запоминая где-то адрес последнего элемента. Это для того, чтобы каждый раз не бегать в конец списка.
Binjo
4 / 1 / 0
Регистрация: 14.10.2012
Сообщений: 22
08.06.2014, 12:53  [ТС]     Односвязные списки: нужно ли при выходе из функции возвращать голову? #3
BumerangSP, проблема в том, что когда вывожу список-он ничего не показывает (список для него пуст)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
//НЕ УПОРЯДОЧЕННЫЙ СПИСОК
typedef char atom;//обзовем char атомом
struct List{
     List* next; //указатель на след. элемент
    atom data; //данные типа Atom
};
 
//============================================================================//
 
//============================================================================//
//функция,решающая как надо вести себя со списком
//принимает голову и данные
//ничего не возвращает
void insert(List* head, atom q){
head=new List;
head->data=q;
head->next=NULL;
}
//============================================================================//
//функция,выводящая список
//принимает голову
//ничего не возвращает
void print(List* head){
    while(head){
        printf("%c",head->data);
        head=head->next;
    }
}
 
int main()
{
   List *head=NULL;
   insert (head,'1');
   print(head);
   system("pause");
   return 0;
}
Не подскажите в чем беда?
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
08.06.2014, 13:24     Односвязные списки: нужно ли при выходе из функции возвращать голову? #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Во-первых, Вы передаете в функцию insert копию указателя, а не сам адрес, поэтому все данные просто теряются. Нужно передавать указатель на указатель (List** head), а потом каждый раз разыменовывать head, либо передать ссылку на указатель (List*&) и ничего разыменовывать не придется. Я не помню, можно ли так делать в Си, но знаю, что можно в С++. Хотя и у Вас тоже не Си: оператора выделение памяти new в Си нет.
Во-вторых, при Вашей реализации insert - head будет держать только последний добавленный элемент. Он и будет выводиться. Вот так будет правильней:
C++
1
2
3
4
5
6
7
8
9
10
void insert(List*& head, atom q){
  List *buff = new List;
  buff->data = q; 
  buff->next = NULL;
 
  if (head != NULL)
      buff->next = head;
  
  head = buff;
}
В данный момент элементы добавляются в начало, поэтому вывод будет происходить задом-наперед.
Binjo
4 / 1 / 0
Регистрация: 14.10.2012
Сообщений: 22
08.06.2014, 13:27  [ТС]     Односвязные списки: нужно ли при выходе из функции возвращать голову? #5
BumerangSP, спасибо!
Yandex
Объявления
08.06.2014, 13:27     Односвязные списки: нужно ли при выходе из функции возвращать голову?
Ответ Создать тему
Опции темы

Текущее время: 22:58. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru