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

Задача со списком - C++

Восстановить пароль Регистрация
 
sanchoflat
4 / 6 / 1
Регистрация: 05.11.2011
Сообщений: 97
30.09.2012, 00:41     Задача со списком #1
Всем привет, задали задачу со списком, но работаю с ними впервые и дается довольно не просто, возникло пара проблем:
Условие:
Введите список, содержащий сведения об экспортируемых товарах. Список имеет следующую структуру: наименование товара - страна, импортирующая товар - объем поставляемой партии в штуках. Программа должна заполнить список, вывести его на экран в виде таблицы, а затем при вводе наименования товара найти страны, в которые экспортируется данный товар и общий объем его экспорта. Отсортируйте список по полю «наименование товара» и по полю «объем поставляемой партии».
+ ввод данных из файла.

1 - вроде понимаю как заполнить из файла, но написать не выходит, + как вывести 3 списка в таблицу, ну и правильно я начинаю сортировать?


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
struct spisok
{
    char value;
    spisok *next;
};
 
///////////////////////////
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    spisok *t, *head;
    spisok *Res;
 
    head = new ( spisok );
    t = head;
 
 
    for ( int i = 0; i<5; i++ )  // заполнение списка 1 из файла
    {
        (*t).next = new ( spisok );
        t = (*t).next;
        (*t).value =  ;    // тут нужно заполнить из файла
        (*t).next = NULL;
    }
 
    ////////поиск
 
    char res;
    cout<<"введите наименование для поиска: ";   //ввожу слово для поиска
    cin>>res;
 
    Res = NULL;
    t = head;
    t = (*t).next;
 
    while ( (t != NULL) && Res == NULL )
        if ((*t).value == res)
            Res = t;
        else t = (*t).next;
хочу пока написать рабочий код для одного списка, потом уже оформить в функции.

спасибо

Добавлено через 3 часа 31 минуту
никто не подскажет, как из файла список заполнить?

пробовал так, но пока безрезультатно
C++
1
2
3
4
5
6
7
8
ofstream f("text.txt");
for ( int i = 0; i<5; i++ )  // заполнение списка 1 из файла
    {
        (*t).next = new ( spisok );
        t = (*t).next;
        f>>(*t).value;
        (*t).next = NULL;
    }
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
just_dude
11 / 11 / 2
Регистрация: 15.01.2012
Сообщений: 104
30.09.2012, 01:08     Задача со списком #2
В с++ есть встроенные списки list например. Вот пример использования:

http://cyberguru.ru/visual-cpp/visua...ib-page10.html

Освоить не трудно. Вот писал я без использования list:


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
63
64
65
66
67
68
69
70
//Односвязный список
#include "stdafx.h"
#include "iostream"
 
using namespace std;
 
 
struct Value
{
        public:int data;
        Value* Next;
        Value(int d):Next(0),data(d){}
        ~Value(){data=0;}
};
 
class Stack
{
        Value* Head;
        public:void Add(int d);
        public:void Delete();
        public:void Print();
        public:Stack(){Head=NULL;}
};
 
void Stack::Add(int d)
{
        Value* newHead=new Value(d);    
        newHead->Next=Head;
        Head=newHead;
}
 
void Stack::Delete()
{
        Value *p;
        p=Head->Next;
        delete Head;
        Head=p;
}
 
 
void Stack::Print()
{
        Value *p=Head;
        while(p!=NULL)
        {
                cout<<p->data<<"  ";
                p=p->Next;
        }
}
 
 
int _tmain(int argc, _TCHAR* argv[])
{
        Stack elements;
 
        elements.Add(10);
        elements.Add(1);
        elements.Add(3);
        elements.Add(7);
        elements.Add(9);
        elements.Add(4);
 
        elements.Delete();
        elements.Delete();
 
        elements.Print();
 
        system("pause");
        return 0;
}
Вникни как работает, допили нужное.
sanchoflat
4 / 6 / 1
Регистрация: 05.11.2011
Сообщений: 97
30.09.2012, 15:46  [ТС]     Задача со списком #3
а если у меня есть массив из элементов, а мой список заполняется этим массивом - как мне обратиться к примеру к 2 или 3 элементу?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
  int myints[5];   //заполняем массив
  for ( int i = 0; i<5; i++)
  {
      cin>>myints[i];
  }
  list<int> mylist (myints,myints+5);
  list<int>::iterator it;
 
  cout << "mylist contains:";
  for ( it=mylist.begin() ; it != mylist.end(); it++ )
    cout << " " << *it;
  cout << endl;
 
  return 0;
}
just_dude
11 / 11 / 2
Регистрация: 15.01.2012
Сообщений: 104
01.10.2012, 00:06     Задача со списком #4
Если используете list, то вы правильно написали. Циклом проходите. Итератор-обычный указатель.

Но что получить доступ на изменение, используйте deque

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
#include "stdafx.h"
#include <iostream>
#include <deque>
 
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
  int myints[5];   //заполняем массив
  for ( int i = 0; i<5; i++)
  {
      cin>>myints[i];
  }
  deque<int> mylist (myints,myints+5);
  deque<int>::iterator it;
 
  cout << "mylist contains:";
 
 //Теперь этот цикл бесполезен 
  for ( it=mylist.begin() ; it != mylist.end(); it++ )
    cout << " " << *it;
 
  //Обратится к любому элементу можно с помощью функции mylist.at(3) или скобок mylist[3]
 
  cout<<mylist[3]<<endl;
  mylist[3]=100500;
  cout<<mylist[3]<<endl;
 
 
  cout << endl;
  char c;
  cin>>c;
  return 0;
}
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
01.10.2012, 00:31     Задача со списком #5
Цитата Сообщение от just_dude Посмотреть сообщение
Но что получить доступ на изменение, используйте deque
Чтобы был доступ на изменение, нужно всего лишь использовать iterator, а не const_iterator. Или вы считаете, что в контейнере list данные изменить нельзя?

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
#include <iostream>
#include <list>
 
using namespace std;
 
int main()
{
  int myints[5];   //заполняем массив
  for ( int i = 0; i<5; i++)
  {
      myints[i] = i;
  }
  list<int> mylist (myints,myints+5);
  list<int>::iterator it;
 
  cout << "mylist contains:";
  for ( it=mylist.begin() ; it != mylist.end(); it++ )
  { 
    cout << " " << *it;
    *it = 42; 
    cout << " " << *it; 
  } 
  cout << endl;
 
  return 0;
}
just_dude
11 / 11 / 2
Регистрация: 15.01.2012
Сообщений: 104
01.10.2012, 01:27     Задача со списком #6
Цитата Сообщение от I.M. Посмотреть сообщение
Чтобы был доступ на изменение, нужно всего лишь использовать iterator, а не const_iterator. Или вы считаете, что в контейнере list данные изменить нельзя?
Не считаю. Итератор это обычный указатель. Написал же выше.
iterator++;
*iterator=100500;

Чтоб добраться до середины нужно пройтись циклом. Поэтому посоветовал более оптимальный вариант
I.M.
01.10.2012, 13:28
  #7

Не по теме:

just_dude, просто формулировка не очень удачная была, согласитесь. и чтобы спасти ТС от заблуждений, я решил прояснить этот момент)

sanchoflat
4 / 6 / 1
Регистрация: 05.11.2011
Сообщений: 97
01.10.2012, 21:06  [ТС]     Задача со списком #8
так а я могу использовать deque с char или string'ом?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.10.2012, 17:50     Задача со списком
Еще ссылки по теме:

C++ работа со списком
C++ Непонятки со списком
C++ Задача с односвязным списком

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

Или воспользуйтесь поиском по форуму:
just_dude
11 / 11 / 2
Регистрация: 15.01.2012
Сообщений: 104
02.10.2012, 17:50     Задача со списком #9
Цитата Сообщение от sanchoflat Посмотреть сообщение
так а я могу использовать deque с char или string'ом?
хоть со своими классами. Изучайте с++ "шаблоны" и сразу всё станет ясно
Yandex
Объявления
02.10.2012, 17:50     Задача со списком
Ответ Создать тему
Опции темы

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