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

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

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

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

21.04.2012, 21:15. Просмотров 821. Ответов 4
Метки нет (Все метки)

Помогите найти ошибку.

Текст задачи: Составить программу, которая формирует список 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 неправильно создает третий список. Помогите исправить ошибку.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.04.2012, 21:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Шаблон класса: из двух списков создать один (C++):

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

Объединение двух списков в один без повтора элементов (С++) - C++
нужно дописать функцию, которая делает из двух списков один (новый), в котором все элементы разные, то есть не повторяются. Спасибо! ...

Создать шаблон класса - C++
Общая постановка. Дано: число N и последовательность a1, a2, … aN Создать шаблон класса, порождающего динамические одномерные массивы с...

Создать шаблон некоторого класса, возможно, реализованного с применением некоторого серверного класса - C++
Добрый день, Уважаемые профессионалы. Прошу помочь в решении задачи. Честно говоря, я ничего не понимаю. И вот...решил...

Создать список с указателями на поля из двух других списков - C++
Здравствуйте. Есть два списка состоящие из структуры, как поля данных и класса, как указателей на структуру. Есть третий список, который...

Создать шаблон класса Set (множество) - C++
Нужно реализовать: Класс •множество set. Дополнительно перегрузить следующие операции: + •добавить элемент в множество (типа item...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
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);
    }
  }
}
правда я не понял, что должно работать, если в списки ничего не добавляется
0
inek
0 / 0 / 0
Регистрация: 09.04.2012
Сообщений: 11
21.04.2012, 21:39  [ТС] #3
Цитата Сообщение от alex_x_x Посмотреть сообщение
правда я не понял, что должно работать, если в списки ничего не добавляется
Должны добавлять элементы из списка L1 и L2 соответственно условию задачи.

Может быть я как-то неправильно реализовала метод createForm. Но сначала должен создавать список L из элементов список L1 и L2 согласно условию задачу, а потом только список L выводится.
0
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
21.04.2012, 21:42 #4
inek, это все отлично, только списки заполнены пустыми строками
0
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);
Дополнение: по условию задачи мне надо создать шаблон класса так сказать универсальный, который может работать на следующих типах данных: целые, вещественные, символьные, строки.

и как раз такое объявление и в принципе разработка шаблона класса в таком ключе, в котором я сделала, дает такую возможность.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.04.2012, 21:48
Привет! Вот еще темы с ответами:

Создать шаблон класса типа стек - C++
Помогите, пожалуйста. Необходимо создать шаблон класса типа стек. Я никак не пойму, как перегружать операторы, если у меня шаблон класса...

Создать шаблон класса, порождающий динамические одномерные массивы - C++
. Дано: число N и последовательность a1, a2, … aN Создать шаблон класса, порождающий динамические одномерные массивы с элементами...

Как создать шаблон класса одномерного динамического массива? - C++
Нужно решить задачу(консольное приложение(совместимое с visual studio 2005)): Со-здать ша-блон кл-асса од-номерного ди-намического...

Создать шаблон класса,реализующий буфер из 5 вещественных чисел. Числа ввести с клавиатуры - C++
Создать шаблон класса,реализующий буфер из 5 вещественных чисел. Числа ввести с клавиатуры содержимое буфера вывести на экран вроде бы...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
21.04.2012, 21:48
Ответ Создать тему
Опции темы

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