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

Связанные списки (переделать программу) - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Почему break нельзя использовать в if? http://www.cyberforum.ru/cpp-beginners/thread925186.html
почему break нельзя использовать в if вот код if(f.eof()==1) { break; } про break MVS говорит что ОПЕРАТОР break можно исолпьзовтаь только внутри цикла
C++ Разыменование указателя! Всем привет, объясните почему и как это работает? int (*pf)(void); int f(void) { static int count ; pf = &f; // This looks ok pf = ***f; // Dereference a function? http://www.cyberforum.ru/cpp-beginners/thread925181.html
C++ Работа функции unique_copy ()
Почему в result после её работы встречаются одинаковые значения? #include <iostream> #include <vector> #include <algorithm> #include <string> #include <iterator> using std :: cout; using std :: cin; using std :: string;
C++ Не записываются символы в файл
Нужно считать из файла текст, и записать по символу в новый файл. Почему - то при открытии выходного файла там ничего нет. Помогите найти ошибку. #include<iostream> #include<fstream> #include<string> using namespace std; void aplpha (string); int main() {
C++ Как ввести свои данные в переменную key? http://www.cyberforum.ru/cpp-beginners/thread925127.html
// lab_work_4.cpp: определяет точку входа для консольного приложения. // #include "stdafx.h" #include <iostream> #include <time.h> #include <string.h> using namespace std; char buff;
C++ Программа которая переводит из 2ой системы в 10ую Создать программу которая переводит из двоичной системы в десятичную. P.S вообще то я знаю как переводить 2ую в 10ую, ну например - если 10100111 = 1*2^0+1*2^1+1*2^2+0*2^3+0*2^4+1*2^5+0*2^6+1*2^7= 1+2+4+32+128= 167. Но как это всё реализовать в коде? подробнее

Показать сообщение отдельно
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
21.07.2013, 11:28     Связанные списки (переделать программу)
Я так понял, что вы застряли на заполнении связного списка. В процедурном стиле.

Ваш код очень комплексен и непонятен. Давайте его сильно упростим, добавив структуру и несколько функций в пару строк каждая.

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
#include <iostream>
#include <string>
 
/**
 * Самодобавляющийся и самоудаляющийся элемент связного списка (нода)
 * без данных, на основе которой можно создавать связный список.
 */
struct NodeBase {
  NodeBase *prev;
  NodeBase *next;
  NodeBase(NodeBase *prev, NodeBase *next) : prev(prev), next(next) {
    prev->next = this;
    next->prev = this;
  }
  NodeBase() : prev(this), next(this) {}
  virtual ~NodeBase() {
    prev->next = next;
    next->prev = prev;
  }
};
 
/**
 * Элемент связного списка (нода), содержащий данные.
 */
struct Node : public NodeBase {
  int value;
  Node(NodeBase *prev, NodeBase *next, const int &value)
    : NodeBase(prev, next), value(value) {}
};
 
/**
 * Вставка в связный список перед определенным элементом
 */
void insert(NodeBase *before, const int &value) {
  new Node(before->prev, before, value);
}
 
/**
 * Проверка связного списка, переданного параметром, на пустоту. 
 * Связный список считается пустым, если его следующий и/или предыдущий
 * элемент указывают на себя же.
 */
bool isEmpty(NodeBase *list) {
  return list->next == list;
}
 
/**
 * Очистка связного списка, удаление всех эелементов, кроме переданного
 * параметром.
 */
void clear(NodeBase *list) {
  while (!isEmpty(list)) {
    delete list->next;
  }
}
 
/**
 * Вывод списка на экран.
 */
void printIntegerList(NodeBase *list) {
  NodeBase *node = (list->next); 
  while (node != list) {
    std::cout << static_cast<Node*>(node)->value << std::endl;
    node = node->next;
  }
}
 
int main(int, char**) {
  // Элемент связного списка перед первым и (он же) после последнего
  // при создании (см. конструктор NodeBase) элементы next и prev
  // указывают на сам создаваемый элемент списка.
  // Такая "кольцевая" структура гарантирует, что элементы next и prev
  // всегда безопасны, так как отличны от 0.
  NodeBase *list = new NodeBase();
 
  // дальше все просто.
  int value; // это переменная для ввода значения с клавиатуры
  // в цикле
  do {
    // читается значение
    std::cin >> value;
    // если оно не ноль (или введено не число)
    if (value != 0) {
      // добавляется в конец списка
      insert(list, value);
    }
  // пока число не станет нулем (или не будет введено не число)
  } while (value != 0);
 
  // вывод списка на экран
  std::cout << "List:" << std::endl;
  printIntegerList(list);
 
 
  // очистка связного списка
  clear(list);
  delete list;
}
Ну и сортировка вставками, например.
Более эффективно мержем или квиксортом, но они гораздо сложнее в реализации.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void swap(int &a, int &b) {
  int c = a;
  a = b;
  b = c;
}
 
void sort(NodeBase *list) {
  if (list == 0 || isEmpty(list)) return;
  for (NodeBase *i = list->next; i != list->prev; i = i->next) {
    for (NodeBase *j = i->next; j != list; j = j->next) {
      if (static_cast<Node*>(i)->value > static_cast<Node*>(j)->value) {
        swap(static_cast<Node*>(i)->value, static_cast<Node*>(j)->value);
      }
    }
  }
}
 
Текущее время: 18:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru