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

Двусвязный в односвязный список - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ asm вставка в C++ http://www.cyberforum.ru/cpp-beginners/thread177595.html
#include <iostream> int a = 10; void func( int& aIn ) { __asm { mov aIn, 15 } }
C++ Перегрузка операций '<<' и '>>' Добрый вечер всем:) У меня вот такое задание: Создайте класс, реализующий однонаправленную очередь. В интерфейс класса должны входить перегруженные операции: 1) добавить элемент в конец очереди (<<); 2) извлечь элемент из начала очереди (>>). Вот что смог написать (что не мог я закоментил): #include <string.h> #include <iostream> using namespace std; http://www.cyberforum.ru/cpp-beginners/thread177586.html
немагу найти ошибку C++
#include <stdio.h> #include <iostream> #include <math.h> #include <conio.h> #include <stdlib.h> using namespace std; void main() { float x, ans;
Реализовать программу для хранения данных C++
Реализовать программу для хранения данных о ценах на компьютерные комплектующие. Предусмотреть следующие поля: наименование, инвентарный номер, габариты. Для изделий, присутствующих на складе, указать цену, для остальных – наименование поставщика и ожидаемый срок поставки (количество дней). Реализовать добавление элемента в список. Предоставить возможность отображения всех элементов списка и...
C++ циклы for, while http://www.cyberforum.ru/cpp-beginners/thread177563.html
for: Среди всех n-значных чисел (n = 1,2,3,4) указать те, сумма цифр которых равна данному числу k. while: Дано натуральное число n. Поменять порядок следования цифр в этом числе на обратный. (только не по цифрам отдельно менять и выводить,а само число целиком)
C++ нужен ли свой деструктор Есть класс class Vetv { public: Vetv(int a,int b, int *ves); Vetv(); virtual ~Vetv(void); int nFrom; int nTo; int *Ves; подробнее

Показать сообщение отдельно
Demonhunterus
1 / 1 / 0
Регистрация: 20.09.2010
Сообщений: 36
17.10.2010, 17:23     Двусвязный в односвязный список
Добрый день.Помогите,пожалуйста,переделать программу,обрабатывающую двухсвязный список,для обработки односвязного списка.
Листинг:
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
#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <cstring>
 
using namespace std;
 
struct base {
  char fio [30]; // ФИО сотрудника
  char bolezn [50]; // Название болезни
  int dlit;         // Длительность болезни
  base *prev;       // Указатель на предыдущую запись
  base *next;       // Указатель на следующую запись
};
 
base *first = NULL; // Указатель на начало списка
base *last = NULL;  // Указатель на конец списка
 
 
int List (void);   
 
void AddItem (void)
{
  base *db;
 
  // создаем новую структуру
  db = new base;
  // заполняем её
  cout << "Введите фамилию сотрудника: ";
  cin >> db->fio;
  cout << "Введите название болезни: ";
  cin >> db->bolezn;
  cout << "Введите длительность болезни: ";
  cin >> db->dlit;
  // добавляем в список
  if (last != NULL) // если список уже существует
  {
    db->prev = last;
    db->next = NULL;
    last->next = db;
    last = db;
  }
  else              // если список ещё не создан
  {
    db->prev = NULL;
    db->next = NULL;
    first = db;
    last = db;
  };
}
 
 
void DeleteItem (void)
{
  // выводим список всех структур
  int i = List ();
  int num;
 
  cout << "Введите номер удаляемой записи ";
  cin >> num;
  if (num < 1 || num > i) return;
 
  base *db = first;
  // находим указатель на удаляемую структуру
  for (i = 1; i < num; i++)
  {
    db = db->next;
  }
  // удаляем её
  if (db)
  {
    if (db->prev) db->prev->next = db->next;
    if (db->next) db->next->prev = db->prev;
    if (db == first) first = first->next;
    if (db == last) last = last->prev;
    delete db;
  };
}
 
 
void Input (void)
{
  bool enough = false;
 
  do
  {
    AddItem (); // заполняем очередную структуру
    cout << "Продолжить ввод информации? (y/n)" << endl;
    if (getch () == 'n') enough = true;
  }
  while (!enough);
}
 
 
void Find (void)
{
  base *db = first;
  char name[20]=" ";
  int i=0;
  cout<<"Введите название болезни :";
  cin>>name;
  cout << "Результаты поиска:" << endl;
  while (db)
  {
    if (!strcmp(db->bolezn,name)) // проверяем запись
    {
                cout << db->fio << " "
                        << db->bolezn << " "
                        << db->dlit << endl;
                i++;
    }
    db = db->next; // переходим к следующей записи
  }
  if (i==0)cout<<"Поиск не дал результата";
}
 
 
int List (void)
{
  base *db = first;
  int i = 0;
 
  cout << endl << "В списке содержатся:" << endl;
  while (db)
  {
    i++;
    cout << i << ". " << db->fio << " " << db->bolezn << " " << db->dlit << endl;
    db = db->next;
  }
  return i;
}
 
 
int Menu (void)
{
  char ch = 0;
 
  // Выводим список возможных вариантов выбора
  cout << "Ваш выбор:" << endl;
  cout << "1. Сформировать список" << endl;
  cout << "2. Печать списка" << endl;
  cout << "3. Добавить в список" << endl;
  cout << "4. Удалить из списка" << endl;
  cout << "5. Поиск в списке" << endl;
  cout << "6. Выход" << endl;
 
  // ожидаем нажатия правильной клавиши
  while (ch < '1' || ch > '6')
  {
    ch = getch ();
  }
 
  // осуществляем выбор согласно набраной клавише
  switch (ch)
  {
    case '1': Input (); break;
    case '2': List (); break;
    case '3': AddItem (); break;
    case '4': DeleteItem (); break;
    case '5': Find (); break;
    case '6': return 0;
  };
  return 1;
}
 
int main (void)
{
        while (Menu ()); // цикл,пока пользователь не выбрал Выход
        return 0;
}
P.S.:Имеются примеры соглашений,на основе которых можно реализовать односвязный список:
1)Список циклический,никогда не бывает пустым:
C++
1
2
3
4
5
6
7
первая вставка: head->next = head;
вставка t после x: t->next=x->next; x->next=t;
удаление после x: x->next=x->next->next
цикл обхода: t=head;
                   do {... t=t>next;}
                   while (t!=head);
проверка на наличие лишь одного элемента: if (head->next==head)
2)Ведущий указатель,null-указатель завершающего узла:
C++
1
2
3
4
5
6
инициализация: head=0;
вставка t после x: if (x==0) {head=t; head->next=0;}
                           else {t->next=x->next;x->next=t;}
Удаление после x: t=x->next; x->next=t->next;
цикл обхода: for (t=head;t!=0;t=t->next)
Проверка на пустоту: if (head=0)
3)Фиктивный ведущий узел,null-указатель завершающего узла:
C++
1
2
3
4
5
6
инициализация: head=new node;
                       head->next=0;
вставка t после x: t->next=x->next;x->next=t;
удаление после x: t=x->next;x->next=t->next
цикл обхода: for(t=head->next;t!=0;t=t->next)
проверка на пустоту: if(head->next=0)
Буду благодарен за любую помощь.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 02:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru