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

Проблема с классом для линейного списка - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ работа с файлами http://www.cyberforum.ru/cpp-beginners/thread129929.html
Помогите пожалуйста. Нужно составить программу, которая читает текстовый файл и в каждой строке все слова размещает в алфавитном порядке. Язык Си(консольная). Примечания: 1. Имя файла,...
C++ Проверить, каких букв больше: гласных или согласных Строка содержит произвольный русский текст. Проверить, каких букв в нем больше: гласных или согласных. http://www.cyberforum.ru/cpp-beginners/thread129926.html
Кодировщик C++
Очень срочно нада Работа с стоками Кодировщик. Написать программу, перекодирующую строку в кодировке KOI в строку в кодировке Windows-1251 и обратно.
Сравнение символов C++
#include <iostream> using namespace std; int main() { char t = "ab"; char j = "ac"; if(t > j)cout << 5; return 0;
C++ Посчитать количество букв в строке http://www.cyberforum.ru/cpp-beginners/thread129913.html
Помогите пожалуйста начинающиму.... Условие задачи: "Необходимо ввести с клавиатуры строку и посчитать количество букв в введеной строке.
C++ Составить программу для нахождения максимального из 4 чисел Составить программу для нахождения максимального из 4 чисел.Используя функцию нахождения максимального подробнее

Показать сообщение отдельно
Adler
78 / 78 / 3
Регистрация: 07.05.2009
Сообщений: 316
16.05.2010, 12:27
ха, вот ещё один косяк:
C++
1
2
(pkey->prev)->next=pkey->prev;
(pkey->next)->prev=pkey->prev;
в этот кусок запарывает всё. т.к выглядеть он должен так:
C++
1
2
3
    Node *next=pkey->next,*prev=pkey->prev;
    if(next)next->prev=prev;
    if(prev)prev->next=next;
Добавлено через 39 секунд
полный вариант:
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
#include <iostream>
#include <stdexcept>
#include <windows.h>
typedef int value_type;
typedef unsigned int size;
using namespace std;
class Node
{
  public:
  Node *next;
  Node *prev;
  value_type d;
};
 
class list
{
private:
  Node *pbeg; //указатель на начало списка
  Node *pend; //указатель на конец списка
  size count;
public:
  list();
  list(const value_type &r, size n); 
  bool IsEmpty()const{return (pbeg==0);} //проверка на пустоту
  void push_back(value_type d);             //добавление элементов с конца
  void push_front(value_type d);             //добавление элементов с начала 
  Node *operator[](int i)throw(std::out_of_range); //доступ к элементу по номеру
  Node *find(value_type d);                  //поиск по информационной части
  bool remove(value_type key);             //удаление по ключу
  long Size()const{return count;};         //возвращает кол-во элементов
  Node *insert(value_type key, value_type d);                //вставка элемента 
  void print();
};
 
void list::push_back(value_type d)
{
  if(!pend)
  {
    Node *pv=new Node; pv->d=d;
    pv->next=0; pv->prev=0;
    pbeg=pv; pend=pv;
    count=1;
  }else{
    Node *pv=new Node; pv->d=d; pend->next=pv;
    pv->next=0; pv->prev=pend;
    pend=pv;
    count++;
  }
 }
 
 void list::push_front(value_type d)
 {
  if(!pbeg)
  {
    Node *pv=new Node; pv->d=d;
    pv->next=0; pv->prev=0;
    pbeg=pv; pend=pv;
    count=1;
  }else{
    Node *pv=new Node; pv->d=d; pbeg->prev=pv;
    pv->next=pbeg; pv->prev=0;
    pbeg=pv;
    count++;
  }
 }
 
list::list()
{
  pbeg=0; pend=pbeg; count=0;
}
 
list::list(const value_type &r, size n)
{
  list tmp;
  for(int i=1; i<=n; i++)
  tmp.push_front(r);
  *this=tmp;
}
 
Node *list::operator[](int i)throw(std::out_of_range)
{
  if(i<=count)
  {
    Node *pv=pbeg;
    int i=1;
    while(i<=count && pv){pv=pv->next; i++;}
    return pv;
  }else throw std::out_of_range("Index out of range");
}
 
Node *list::find(value_type d)
{
  Node *pv=pbeg;
  while(pv)
  {
    if(pv->d==d) break;
    pv=pv->next;
  }
  return pv;
}
 
bool list::remove(value_type key)
{
  Node *pkey=find(key);
  if(!pkey)return false;
  if(pkey==pbeg)
  {
    pbeg=pbeg->next;
    pbeg->prev=0;
  }
  if(pkey==pend)
  {
    pend=pend->prev;
    pend->next=0;
  }else{  
    Node *next=pkey->next,*prev=pkey->prev;
    if(next)next->prev=prev;
    if(prev)prev->next=next;
  }
  if(pkey==pbeg)pbeg=0;if(pkey==pend)pend=0;delete pkey;
  count--;
  return true;
}
 
Node *list::insert(value_type key, value_type d)
{
  if(Node *pkey=find(key))
  {
    Node *pv=new Node;
    pv->d=d;
    pv->next=pkey->next;
    pv->prev=pkey;
    pkey->next=pv;
    if(pkey!=pend)(pv->next)->prev=pv;else pend=pv;
    count++;
    return pv;
  }
  return 0;
}
 
void list::print()
{
  Node *pv=pbeg;
  while(pv)
  {
    cout<<pv->d<<' ';
    pv=pv->next;
  }
  cout<<endl;
}
 
list l;
int main()
{
  for(int i=0;i<10;i++)l.push_back(i);
  l.remove(7);
  l.push_back(5);
  l.insert(5,0);
  l.print();
  system("pause");
}
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru