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

Шаблон класса: из двух списков создать один - C++

Восстановить пароль Регистрация
 
inek
0 / 0 / 0
Регистрация: 09.04.2012
Сообщений: 11
21.04.2012, 21:15     Шаблон класса: из двух списков создать один #1
Помогите найти ошибку.

Текст задачи: Составить программу, которая формирует список L включив в него по одному разу элементы, которые входят в один из списков L1 и L2, но в то же время не входит в другой из них.

Разработала шаблон класса:
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
#include <iostream>
 
using namespace std;
 
template <typename T>
class List
{
    struct Node
    {
        T data;
        Node *next;
        Node(T d, Node *n = 0):data(d), next(n) {}
    };
    Node *head;
public:
    List(Node *h = 0):head(h){}
    ~List();
    bool isEmpty();
    void insertAfter(Node *pre, T d);
    void removeAfter(Node *pre);
    void pushFront(T d);
    T popFront();
    void print();
    Node *search(T d);
    void removeDuplicate(Node *one, Node *two);
    void create(int k);
    void createFrom(List<T> *L1, List<T> *L2);
    
};
 
template <typename T>
List<T>::~List()
{
    while (!isEmpty())
       popFront();
}
 
template <typename T>
bool List<T>::isEmpty() 
{
    return !head;
}
 
template <typename T>
void List<T>::insertAfter(Node *pre, T d) 
{ 
    if(!pre) return;
    Node *newNode = new Node(d,0);
    newNode->next = pre->next;
    pre->next = newNode;
}
 
template <typename T>
void List<T>::removeAfter(Node *pre)
{
    if (!pre || !pre->next) return;
    Node *tmp = pre->next; 
    pre->next = pre->next->next;
    delete tmp;
}
 
template <typename T>
void List<T>::pushFront(T d)
{
    Node *newNode = new Node(d,0);
    if(!head) {
        head = newNode;
        return;
    }
    newNode->next = head;
    head = newNode;
}
 
template <typename T>
T List<T>::popFront()
{
    T data;                 
    if(!head) return data;
    Node *tmp = head;
    data = head->data;
    if(head->next) {
        head = head->next;
        delete tmp;
        return data;
    }
    delete tmp;
    head = NULL;
    return data;
}
 
template <typename T>
typename List<T>::Node* List<T>::search(T d)
{
    if(!head) return NULL;
    Node* cur = head;
    while(cur) {
        if(cur->data == d) return cur;
        cur = cur->next;
    }
    return NULL;
}
 
 
template <typename T>
void List<T>::print()
{
    if(!head) return;
    Node *cur  = head;
    while(cur) {
        cout << cur->data << "; ";
        cur = cur->next;
    }
    cout << endl;
}
 
template <typename T>
void List<T>::create(int k)
{
    T d;
    for (int i = 1; i <= k; i++)
    {
        cout << "Enter " << i << "-i element: ";
        cin >> d;
        pushFront(d);
        
    }
}
template <typename T>
void List<T>::removeDuplicate(Node *one, Node *two)
{Node *tmp = head;
 while(tmp->next) 
 { pushFront(one.d);
                  }
    }
 
template <typename T>
void List<T>::createFrom(List<T> *L1, List<T> *L2)
{ T dt;
  while(!L1->isEmpty())
{
    dt = L1->popFront();
    if(L2->search(dt) == NULL && search(dt) == NULL)
    {
        pushFront(dt);
    }
}
 
while(!L2->isEmpty())
{
    dt = L2->popFront();
    if(search(dt) == NULL)
    {
        pushFront(dt);
    }
}
}
Основной метод main выглядит так:

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 "List.h"
#include <iostream>
#include <string>
 
using namespace std;
 
int main()
{ int n, n1, n2;
 
        
    List<string> *L1 = new List<string>(NULL);
    L1->create(7);
    L1->print();
    
    List<string> *L2 = new List<string>(NULL);
    L2->create(7);
    L2->print();
    
    List<string> *L = new List<string>(NULL);
    L->createFrom(L1,L2);
  L->print();
 
 
    system("PAUSE");
    return EXIT_SUCCESS;
}
Метод createFrom неправильно создает третий список. Помогите исправить ошибку.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.04.2012, 21:15     Шаблон класса: из двух списков создать один
Посмотрите здесь:

C++ Создать шаблон класса типа стек
Создать шаблон класса,реализующий буфер из 5 вещественных чисел. Числа ввести с клавиатуры C++
Объединение двух списков в один без повтора элементов (С++) C++
Создать шаблон класса C++
Как создать шаблон класса одномерного динамического массива? C++
Создать шаблон класса, порождающий динамические одномерные массивы C++
C++ Создать шаблон класса Set (множество)
C++ Один блок catch для двух типов исключений порожденных от одного класса

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
21.04.2012, 21:33     Шаблон класса: из двух списков создать один #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
template <typename T>
void List<T>::createFrom(List<T> *L1, List<T> *L2)
{ T dt;
  while(!L1->isEmpty())
  {
    dt = L1->popFront();
    if(L2->search(dt) == NULL)
    {
        std::cout << "< " << dt << "> ";
        pushFront(dt);
    }
  }
 
  while(!L2->isEmpty())
  {
    dt = L2->popFront();
    if(search(dt) == NULL)
    {
        std::cout << "<< " << dt << ">> ";
        pushFront(dt);
    }
  }
}
правда я не понял, что должно работать, если в списки ничего не добавляется
inek
0 / 0 / 0
Регистрация: 09.04.2012
Сообщений: 11
21.04.2012, 21:39  [ТС]     Шаблон класса: из двух списков создать один #3
Цитата Сообщение от alex_x_x Посмотреть сообщение
правда я не понял, что должно работать, если в списки ничего не добавляется
Должны добавлять элементы из списка L1 и L2 соответственно условию задачи.

Может быть я как-то неправильно реализовала метод createForm. Но сначала должен создавать список L из элементов список L1 и L2 согласно условию задачу, а потом только список L выводится.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
21.04.2012, 21:42     Шаблон класса: из двух списков создать один #4
inek, это все отлично, только списки заполнены пустыми строками
inek
0 / 0 / 0
Регистрация: 09.04.2012
Сообщений: 11
21.04.2012, 21:48  [ТС]     Шаблон класса: из двух списков создать один #5
Цитата Сообщение от alex_x_x Посмотреть сообщение
inek, это все отлично, только списки заполнены пустыми строками
Вы, наверняка, про объявления списков:
C++
1
    List<string> *L1 = new List<string>(NULL);
Дополнение: по условию задачи мне надо создать шаблон класса так сказать универсальный, который может работать на следующих типах данных: целые, вещественные, символьные, строки.

и как раз такое объявление и в принципе разработка шаблона класса в таком ключе, в котором я сделала, дает такую возможность.
Yandex
Объявления
21.04.2012, 21:48     Шаблон класса: из двух списков создать один
Ответ Создать тему
Опции темы

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