Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 5.00
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
#1

Не выводится содержимое динамического списка - C++

14.10.2012, 14:38. Просмотров 1587. Ответов 40
Метки нет (Все метки)

доброго времени суток.
структура с типом стринг, трем элементам структуры присваивается значение потом при попытки вывести одно из значений, тоесть обратится к списку через указатель выдает ошибку в строке вывода.
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
#include <vcl.h>
#pragma hdrstop
#include<iostream.h>
#include <tchar.h>
#include <string.h>
//---------------------------------------------------------------------------
 
struct lfile{
string name;
string data;
string upd;
    lfile*next;
}*start,*p;
void create_list(string a,string b,string c){
p = new lfile;
p->name=a;
p->data=b;
p->upd=c;
p->next = NULL;
start = p;
return;
}
char main(){
 setlocale(LC_ALL, "rus");
string a,b,c;
printf("Введите значение для первого элемента, создаваемого списка: ");
a="kot";
b="dog";
c="got";
cout<<p->name; \\ вот тут выдает ошибку
return 0;
}
ошибка такая [BCC32 Error] probstrukt.cpp(32): E2094 'operator<<' not implemented in type 'ostream' for arguments of type 'string'
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.10.2012, 14:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не выводится содержимое динамического списка (C++):

Не выводится на экран элемент динамического массива - C++
Здравствуйте! Сразу прошу прощения за название темы, т.к. далее по тексту вы узнаете, что проблема относится не совсем к выводу на экран...

Не выводится содержимое массива - C++
Привет ребята! Задали такую задачку, код написал, но видать где-то косяк, массив из значений не выводит, а s2,k2,k3,p - выводит вот код...

А чего не выводится содержимое вектора? - C++
Здравствуйте. Новичок. Задача: Написать функцию которая считывает слова из входного потока и сохраняет их в векторе. Я придумал...

Выводится содержимое переменной, а не адрес - C++
Тип char. Почему выводится содержимое? pAdd-&gt;name=a.taskName; cout&lt;&lt;&amp;a.taskName&lt;&lt;endl;

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

Структура в виде динамического списка - C++
Доброе время суток. Есть программа #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;locale.h&gt; #include &lt;windows.h&gt; #include...

40
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
14.10.2012, 18:40  [ТС] #16
Цитата Сообщение от BumerangSP Посмотреть сообщение
Стек - это и есть структура. От списка отличается, во-первых, назначением, во-вторых, особенностями реализации.
а пример можно? как понять названием? и какая другая реализация у него может быть?
0
BumerangSP
4287 / 1409 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
14.10.2012, 18:57 #17
lexflax, назначением. В смысле, стеки, в основном, нужны для хранения каких-то промежуточных значений. Реализация (немного не так выразился), в смысле в список, например, можно добавлять элементы в начало, в конец, в середину. У стеков только один способ. Вообще, информации много на эту тему.
0
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
14.10.2012, 19:04 #18
Цитата Сообщение от BumerangSP Посмотреть сообщение
lexflax, назначением. В смысле, стеки, в основном, нужны для хранения каких-то промежуточных значений. Реализация (немного не так выразился), в смысле в список, например, можно добавлять элементы в начало, в конец, в середину. У стеков только один способ. Вообще, информации много на эту тему.
то что список проще я сам понимаю , поэтому и спросил у товарища про ООП, а про стек я сказал увидев у него в его структуре указатель на следующий

Добавлено через 48 секунд
Цитата Сообщение от lexflax Посмотреть сообщение
а пример можно? как понять названием? и какая другая реализация у него может быть?
поищите в интернете, способ хранения информации, либо стек
0
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
16.10.2012, 06:44  [ТС] #19
вот функция добавления нового элемента в стктуру после уже созданного
C++
1
2
3
4
5
6
7
8
9
10
void new_element(string a,string b,string c){
lfile *q;
q = new lfile;
q->name= a;
q->data=b;
q->upd=c;
q->next = p->next;
p->next = q;
return;
}
вот только он становится вторым и чтоб его вывести надо писать строку
C++
1
cout<<p->next->name<<endl<<p->next->data<<endl<<p->next->upd;
но это и не удобно и не практично, как это все автоматизировать или упростить чтоб мог допустим добавлять элементы и по номеру элемента выводить его содержимое , допустим вывести содержимое 4 элемента... вот такой сейчас код
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
42
43
44
45
46
#include <vcl.h>
#pragma hdrstop
#include<iostream.h>
#include <tchar.h>
#include <string>
//---------------------------------------------------------------------------
#include <conio.h>
struct lfile{
string name;
string data;
string upd;
    lfile*next;
}*start,*p,*q;
void create_list(string a,string b,string c){
p = new lfile;
p->name=a;
p->data=b;
p->upd=c;
p->next = NULL;
start = p;
return;
}
void new_element(string a,string b,string c){
lfile *q;
q = new lfile;
q->name= a;
q->data=b;
q->upd=c;
q->next = p->next;
p->next = q;
return;
}
main(){
setlocale(LC_ALL, "rus");
string a,b,c;
cout<<"Vvedite znachenie pervogo elementa v sozdavaemom spiske: ";
cin>>a>>b>>c;
create_list(a,b,c);
cout<<p->name<<endl<<p->data<<endl<<p->upd;
cout<<"dobavit eshe element: ";
cin>>a>>b>>c;
new_element(a,b,c);
cout<<p->next->name<<endl<<p->next->data<<endl<<p->next->upd;
getch();
return 0;
}
0
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
16.10.2012, 10:45 #20
сделайте функцию вывода по номеру элемента (у текущего элемента индекс 1, у самого 1 в стеке 0, поэтому индекс указвает на сколько глубоко в стек надо опустится)
C++
1
2
3
4
5
6
7
8
lfile *getFile(int index, lfile *curFile){
      if (index){
         index--;
         return getFile(index,curFile->next);
      }
      else
        return  curFile;
    }
и тогда вывод заменится таким образом
C++
1
2
cout<<getFile(1,p)->name<<endl<<getFile(1,p)->data;
        cout<<endl<<getFile(1,p)->upd;
0
BumerangSP
4287 / 1409 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
16.10.2012, 15:17 #21
lexflax, оно еще и непрактично тем, что в структуре содержится 3 переменных одинакового типа, а Вы их используете для одного и того же: для заполнения, а потом для вывода. Не проще ли в таком случае завести 1 переменную типа string и добавлять очередной элемент только в нее. Например, в цикле 1-10 можно добавить сразу 10 элементов только через одну функцию. И выводить тоже через одну. Так намного удобней и проще.
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <vcl.h>
#pragma hdrstop
#include<iostream.h>
#include <tchar.h>
#include <string>
//---------------------------------------------------------------------------
#include <conio.h>
struct lfile
{
 string data;
 lfile*next;
}*start,*p,*q;
 
void add(string a)
{ 
 p = new lfile;
 p->data=a;
 p->next = start;
 start = p;
}
 
void new_element(string a)
{
 lfile *q;
 q = new lfile;
 q->data=a;
 q->next = p->next;
 p->next = q;
}
 
void print()
{
 cout<<endl;
 while (start)
  {
   cout<<start->data<<endl;
   start=start->next;
  }
}
 
int main()
{
 setlocale(LC_ALL, "rus");
 string a;
 cout<<"Vvedite znachenie pervogo elementa v sozdavaemom spiske: ";
 for (int i=0; i<3; i++)
  {
   cin>>a;
   add(a);
  }
 print();
 cout<<"dobavit eshe element: ";
 for (int i=0; i<3; i++)
  {
   cin>>a;
   add(a);
  }
 print();
 getch();
 return 0;
}
И, да: была ошибка в первой функции: p->next = NULL;
Указатель на следующий элемент должен указывать на start. А Вы и не заметили, потому что выводили только первые добавленные элементы. От этого сути в списке никакой.
0
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
16.10.2012, 17:00 #22
Цитата Сообщение от BumerangSP Посмотреть сообщение
От этого сути в списке никакой.
Что вы привязались со своим списком, унего органихзовано все в виде СТЕКА
Тем более он сделал процедуру добавления , котороая правильно работает, и которую тоже можно в цикл загнать, он только не знал как ему выводить из СТЕКА, я ему написал
оно еще и непрактично тем, что в структуре содержится 3 переменных одинакового типа, а Вы их используете для одного и того же: для заполнения, а потом для вывода
а по поводу 3 переменных одинакого типа, это тоже абсурд, переменные делятся в первую очердь по именам, а уж потом по типам, и то, что тут он пока только учится поэтому использование переменных такое простое, возможно они необходимы для другого
0
BumerangSP
4287 / 1409 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
16.10.2012, 17:16 #23
Nixy, да не стек это никакой, а односвязный список, раз он так легко элементы просматривает. А то, что Вы увидели там указатель на следующий элемент, так это не только в стеке бывает. У стека есть только добавление, проверка на пустоту и выборка с удалением просмотренного элемента.
void create_list(string a,string b,string c){
p = new lfile;
p->name=a;
p->data=b;
p->upd=c;
p->next = NULL;
start = p;
return;
}
Вы это компилировали, проверяли? Попробуйте туда добавить эти 3 элемента больше одного раза.
Тем более, это был как бы совет, нежели указание. Работая со списком, нужно, в первую очередь видеть его работу. В данном случае это больше похоже на просто присваивание значений динамическим переменным, а не очередность (я все про ту же первую функцию).
0
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
16.10.2012, 17:26 #24
В том то и дело что это стек из за того что у первого элемента будет в next NULL записан. НА нем стек и кончается он на дне, и да я тестил вот
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include "windows.h"
#include<iostream.h>
#include <string>
 
    struct lfile{
        string name;
        string data;
        string upd;
        lfile*next;
    }*start,*p,*q;
 
    lfile *getFile(int index, lfile *curFile){
      if (index){
         index--;
         return getFile(index,curFile->next);
      }
      else
        return  curFile;
    }
    void create_list(string a,string b,string c){
        p = new lfile;
        p->name=a;
        p->data=b;
        p->upd=c;
        p->next = NULL;
        start = p;
        return;
    }
    void new_element(string a,string b,string c){
        lfile *q;
        q = new lfile;
        q->name= a;
        q->data=b;
        q->upd=c;
        q->next = p->next;
        p->next = q;
    return;
    }
    int main(){
        SetConsoleCP(1251);
        SetConsoleOutputCP(1251);
        setlocale(LC_ALL, "rus");
        string a,b,c;
        cout<<"Vvedite znachenie pervogo elementa v sozdavaemom spiske: ";
        cin>>a>>b>>c;
        cout<<endl;
        create_list(a,b,c);
        for (int i = 0; i < 3; i++) {
 
        cout<<"dobavit eshe element: ";
        cin>>a>>b>>c;
        cout<<endl;
        new_element(a,b,c);
        }
        for (int i = 0; i < 4; i++) {
            cout<<getFile(i,p)->name<<endl<<getFile(i,p)->data;
            cout<<endl<<getFile(1,p)->upd;
        }
 
        system("pause");
        return 0;
    }
0
BumerangSP
4287 / 1409 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
16.10.2012, 17:51 #25
Все правильно? Просто способ вывода странный какой-то) Вижу четырежды число 9, хотя вводил 1 раз, и 0 троек, хотя вводил дважды.
0
Миниатюры
Не выводится содержимое динамического списка  
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
16.10.2012, 18:08 #26
Цитата Сообщение от BumerangSP Посмотреть сообщение
Все правильно? Просто способ вывода странный какой-то) Вижу четырежды число 9, хотя вводил 1 раз, и 0 троек, хотя вводил дважды.
там затесалась ошибка
C++
1
cout<<endl<<getFile(1,p)->upd;
нужно заменить на
C++
1
cout<<endl<<getFile(i,p)->upd;
0
BumerangSP
4287 / 1409 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
16.10.2012, 18:17 #27
Ок. Теперь о порядке вывода: раз элементы в стек (раз уж Вы говорите, что стек). Вроде с конца как бы. Почему сначала выводятся элементы, формирующие его? А как же удаление после выборки?

Не по теме:

Все, вроде это окончательный пост)

0
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
16.10.2012, 18:23 #28
А удаляем сверху, на 2 курсе, у моего одногрупника по стекам, была к.р , я ему помогал с этим, очередь должна знать адрес как начала, так и конца, а стек знает адрес конца, и следующего

Добавлено через 36 секунд
Цитата Сообщение от BumerangSP Посмотреть сообщение
Не по теме:
Все, вроде это окончательный пост)
возможно у ТС будут еще вопросы
0
BumerangSP
4287 / 1409 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
16.10.2012, 18:31 #29
Nixy,
возможно у ТС будут еще вопросы

Не по теме:

У ТС возможно, я свой пост несколько раз правил, окончательный вариант моего поста)



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

Не по теме:

Где Вы это читали? Ссылку можно?



Что касаемо кода: ввожу, например, 111, 222, 333, 444. По правильному (как у стека), вывод должен начинаться с четверок, т.е. с конца, притом удаляясь со стека.
0
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
16.10.2012, 18:35 #30
если внимательно глянешь на функцию вывода , я ее сделал таким образом ,чтоб проше было для понимания, 1 элемент стека, это тот который лежит нижним в самом дне, и собственно 0 по номеру эллемент он будет 111 , другое дело , если необходимо организовать удаление с выводом то картина поменяется, когда я говорю про список я подразумеваю очередь может чо подзабыл, и это разные вещи
0
16.10.2012, 18:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.10.2012, 18:35
Привет! Вот еще темы с ответами:

Создать шаблон динамического списка - C++
спроектировать шаблон для класса динамический список Создать конструкторы: по умолчанию, с параметрами и копирования и продемонстрировать...

Абстрактный класс динамического списка - C++
Как создать из класса динамического списка - абстрактный? Ну ясно что абстрактный класс - это класс с чистой виртуальной функцией. ...

Поместить в стек из динамического списка - C++
У меня такая задача: Последовательность вещественных чисел сохранить в динамическом списке. Поместить в стек все отрицательные числа,...

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


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

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