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

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

Войти
Регистрация
Восстановить пароль
 
nastin
1 / 1 / 0
Регистрация: 15.10.2012
Сообщений: 36
#1

Исправить ошибки в связном списке - C++

18.03.2013, 00:21. Просмотров 349. Ответов 1
Метки нет (Все метки)

Почти готовая лабораторка, но не хватает несколько деталей. Помогите решить проблему, пожалуйста!
Задание :
1. Создание списка из файла.
2.Insert <елемент> n Вставка елемента в позицию n.
3. DELETE N Удаление елемента з N позиции.
4.CHANGE M N – Смена елементов M N .
5.DUMP Вывод в конечный файл .

Все работает, но когда открываю текстовый файл со списком или отчетом, вместо элементов списка какие-то значки, а когда открываю файл в программе все ок, как исправить?
И еще элементы списка у меня числа, а проверку на ввод как сделать не знаю!
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
// linklist.cpp
// linked list
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <cstdio>
using namespace std;
////////////////////////////////////////////////////////////////
struct link                           //one element of list
   {
   int data;                          //data item
   link* next;                        //pointer to next link
   };
////////////////////////////////////////////////////////////////
class linklist                        //a list of links
   {
   private:
      link* first;                    //pointer to first link
       
   public:
      linklist()                      //no-argument constructor
         { first = NULL; }            //no first link
      void additem(int d);            //add data item (one link)
      void display();                 //display all links
      void diskOut();
      void diskIn();
      void report();
      void del_po_numb(int n);
      void reverse(int n,int m);
 
   };
//--------------------------------------------------------------
void linklist::additem(int d)         //add data item
   {
   link* newlink = new link;          //make a new link
   newlink->data = d;                 //give it data
   newlink->next = first;             //it points to next link
   first = newlink;                   //now first points to this
   }
//--------------------------------------------------------------
void linklist::display()              //display all links
   {
   cout << endl;
   link* current = first;             //set ptr to first link
   while( current != NULL )           //quit on last link
      {
      cout << current->data << endl;  //print data
      current = current->next;        //move to next link
      }
   cout << endl;   
   }
//--------------------------------------------------------------
void linklist::diskOut()
   {
   ofstream outfile;
   int d;
   outfile.open("data.txt",ios::in);
   link* current = first;           
   while( current != NULL )          
      {
      d = current->data;
      outfile.write(reinterpret_cast<char*>(&d), sizeof(int));
      current = current->next;        
      }
   outfile.close();
   }
 
//--------------------------------------------------------------
void linklist::report()
   {
   ofstream outfile;
   int d;
   
  
   outfile.open("report.txt",ios::out|ios::in);
   link* current = first;           
   while( current != NULL )          
      {
      d = current->data;
      outfile.write(reinterpret_cast<char*>(&d), sizeof(int));
      current = current->next;        
      }
   outfile.close();
   }
 
//--------------------------------------------------------------
void linklist::diskIn()
   {
               
   ifstream infile;
   int d;
   
   infile.open("data.txt",ios::in );
   infile.seekg(0);
   infile.read((char*)&d,sizeof(int));
   while(infile)
      {    
      link* newlink = new link;
      newlink->data = d;
      newlink->next = first;    
      first = newlink; 
      infile.read((char*)&d,sizeof(int));    
      }
   }
//-------------------------------------------------------------
void linklist::del_po_numb(int n)
{
   int i=1; 
      for (link* tmp=first;(*tmp).next!=NULL;tmp=(*tmp).next)
      {
         if(i==(n-1))
         {
              (*tmp).next=tmp->next->next;
               
              break;           
         }
         i++;
      }
      cout<<endl;
}
//------------------------------------------------------------- 
void linklist::reverse(int one,int two)
 {
        link *p1, *prev_p1, *p2, *prev_p2, *tmp_pos;
 
        prev_p1 = first;
        prev_p2 = first;
 
        for(int i = 1; i < one; i++) {
                prev_p2 = prev_p2->next;
        }
        p2 = prev_p2->next;
        for(int i = 1; i < two; i++) {
                prev_p1 = prev_p1->next;
        }
        p1 = prev_p1->next;
 
       // p2->data.vivod(); printf("\n");
       // p1->data.vivod(); printf("\n");
 
        if (prev_p1 == p2)
        {
            p2->next = p1->next;
            p1->next = p2;
            prev_p2->next = p1;
        }
        else if (prev_p2 == p1)
        {
            p1->next = p2->next;
            p2->next = p1;
            prev_p1->next = p2;
        }
        else
        {
            swap(p1->next, p2->next);
            swap(prev_p1->next, prev_p2->next);
        }
}
//---------------------------------------------------------------
 
////////////////////////////////////////////////////////////////
int main()
 {  
   linklist li;       
   int pos,x;
   char num;
   char ch;
   char ans;
  int n;
  int p,m;
   while(true)
   {
   cout << "What do you want to do? "
   "\n'a'-add to list"
   "\n's'-show the list"
   "\n'w'-write to file"
   "\n'r'-read file"
   "\n'j'- make report"
   "\n'o'- reverse 2 elements"
   "\n'd'-delete element number n"
   "\n'x'-exit" << endl; cin >> ans;
    switch(ans)
      {
      case 'a':  cout << "Enter link in the list: "; cin >> num; li.additem(num); break;      
      case 's':  li.display(); break;
      case 'w':  li.diskOut(); break;
      case 'r':  li.diskIn(); break;
      case 'j':  li.report(); break;
      case 'd':  cout << "Enter n :"; cin >> n; li.del_po_numb(n); break;
      case 'o':  cout <<"Enter first position :"; cin >> p; cout << "Enter second position:"; cin >> m; li.reverse(p-1,m-1);break;
      case 'x':  exit(0);
     
      default: cout << "Wrong command.";
      }
   }
   
   
   system("PAUSE");
   return 0;
 }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.03.2013, 00:21
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Исправить ошибки в связном списке (C++):

Пузырёк на связном списке - C++
Здравствуйте! Не могли Вы подсказать, почему после первого прохождения по списку все остается как было. Т.е. элементы переставляются, но...

непонятка в связном списке - C++
есть 2 конструктора - list(const str&amp;) и list() если в main использую 1ый конструктор, то всё работает, если 2ой - ошибка, всякие там...

Очередь на связном списке - C++
OldTail-&gt;next-&gt;tail; ругается на эту строчку, пишет class QueueNode не содержит члена tail и просмотрите, пожалуйста, остальной код....

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

Как удалить узел в связном списке? - C++
привет всем! подскажите пожалуйста в подробностях как происходит удаление узла в алгоритме связного списка ?? #include &quot;stdafx.h&quot; ...

Copy-Constructor В Шаблонном Связном списке - C++
Скажіте пожалуйста где тут ошыбка? Добавлено через 49 секунд Ран тайм ерор кидает в копи конструкторе 100% вот код ...

1
SDev
43 / 41 / 10
Регистрация: 15.03.2013
Сообщений: 89
18.03.2013, 08:47 #2
вместо read и write используйте операторы >> и <<, тогда целочисленные значения будут выводится в файл текстовом формате

Добавлено через 8 минут
Цитата Сообщение от nastin Посмотреть сообщение

Все работает, но когда открываю текстовый файл со списком или отчетом, вместо элементов списка какие-то значки, а когда открываю файл в программе все ок, как исправить?
И еще элементы списка у меня числа, а проверку на ввод как сделать не знаю!
переменная num наверное должна быть типа int, иначе в список заносятся код введенного символа, а не число представленное этим символом
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.03.2013, 08:47
Привет! Вот еще темы с ответами:

Алгоритм Дейкстры в связном списке + файлы. - C++
Задача такова : Имеются n городов. Некоторые из них соединены дорогами известной длины. Найти кратчайшие маршруты из заданного города в...

Как в связном списке обратиться к элементу по адресу - C++
как в связном списке обратиттся к элементу по нужному адресу? Добавлено через 46 минут как в связном списке обратится к нужному...

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

Как в связном списке присвоить NULL полю next, если тип этого поля не указатель, а ссылка? - C++
Друзья! В общем, надо реализовать связный список и понятно, последний элемент должен содержать адрес NULL, вот ломаю голову как это...


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

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

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