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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Binjo
4 / 1 / 0
Регистрация: 14.10.2012
Сообщений: 22
#1

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

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

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

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

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

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

Односвязные списки - C++
Вечер добрый) Сформировать список символов, оканчивающийся точкой. Заменить в списке символ “A” на символ “0”. Сама задача есть и...

Односвязные списки - C++
Вот такая задачка Дан текстовый файл. Группы символов, разделенные пробелами, будем называть словами. В файле оставить только по...

Односвязные списки - C++
Есть программа которая должна выводить координаты точки (x.y.z) Ввод должен выполняться путем считывания из файла, Сделал все кроме...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BumerangSP
4286 / 1408 / 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
4286 / 1408 / 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, спасибо!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.06.2014, 13:27
Привет! Вот еще темы с ответами:

Односвязные списки - C++
Задача: добавить в список 1 узлы, содержащие слова в списке 2, не совпадающие со словами списка 1(линейный список 1 из слов хранится в...

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

односвязные списки - C++
Помогите пожалуста в проге нужно в методе класа List нужно вставить елементы с первого списка в второй после последнего вхождение...

Односвязные списки - C++
помогите написать функцию которая меняет местами два элемента списка, заданные значением информационной части. Node *peremena(Node...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
08.06.2014, 13:27
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru