Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
4 / 1 / 0
Регистрация: 14.10.2012
Сообщений: 22
1

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

08.06.2014, 09:23. Показов 1310. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.
Верю, что когда-то здесь на этот вопрос давался ответ, но я не нашел.
Скажите, пожалуйста, вот у меня изначально голова указывает на NULL.Чтобы добавить элемент в конец я прохожу по списку до конца,затем выделяю память под новый элемент,делаю указатель на него от элемента,который был последним,и указываю на Null. Вопрос в следующем:мне нужно при выходе из функции возвращать голову или нет?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.06.2014, 09:23
Ответы с готовыми решениями:

Односвязные списки (функции обращения списка)
1. Написать рекурсивную функцию обращения списка. 2. Написать итеративную функцию обращения...

Создать на основе класса дополнительный метод из функции main() (односвязные списки)
//Ñîñòàâèòü ïðîãðàììó, êîòîðàÿ â ñïèñêå L çàìåíÿåò ïåðâîå âõîæäåíèå ñïèñêà L1 (åñëè òàêîå åñòü) íà...

Когда нужно/не нужно возвращать объект при перегрузке присваивания?
Доброго времени суток! Перегрузка присваивания: class alpha { private: int data; public:...

Точно ли в функции нужно возвращать s?
Вот прога, которая ищет в 2-х мерном массиве, т.е. матрице число строк, не содержащих 0. Точно ли в...

4
4311 / 1422 / 463
Регистрация: 16.12.2010
Сообщений: 2,939
Записей в блоге: 3
08.06.2014, 12:50 2
Вы описали функцию добавления элемента в список. Зачем из нее что-то возвращать?
Можно лишь модифицировать такую функцию, просто запоминая где-то адрес последнего элемента. Это для того, чтобы каждый раз не бегать в конец списка.
0
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;
}
Не подскажите в чем беда?
0
4311 / 1422 / 463
Регистрация: 16.12.2010
Сообщений: 2,939
Записей в блоге: 3
08.06.2014, 13:24 4
Лучший ответ Сообщение было отмечено Binjo как решение

Решение

Во-первых, Вы передаете в функцию 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;
}
В данный момент элементы добавляются в начало, поэтому вывод будет происходить задом-наперед.
1
4 / 1 / 0
Регистрация: 14.10.2012
Сообщений: 22
08.06.2014, 13:27  [ТС] 5
BumerangSP, спасибо!
0
08.06.2014, 13:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.06.2014, 13:27
Помогаю со студенческими работами здесь

Односвязные списки
Помогите, никак не могу понять что делать.. Написал код самого линейного списка, а дальше завис.

Односвязные списки
Доброго времени суток! Подскажите, пожалуйста где тут ошибка в коде. Заранее спасибо:rose: ...

Односвязные списки С++
Помогите пожалуйста с заданием: Необходимо создать список(из целых чисел) добавлением элемента в...

Односвязные списки
помогите написать функцию которая меняет местами два элемента списка, заданные значением...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru