1 / 1 / 0
Регистрация: 07.10.2015
Сообщений: 96
1

Объединение двух связных списков с объектами одного типа

06.11.2016, 11:58. Показов 3045. Ответов 19
Метки нет (Все метки)

Здравствуйте. При изучении связных списков, написал шаблон для связного списка, с функциями добавления и удаления с начала и конца списка. Далее прочитал задачу написать функцию сложения двух списков типа char.
я написал функцию в которую передал два списка типа char.
C++
1
2
3
4
5
template <class typenode>
void List<typenode>::contenace(List<typenode>& List1, List<typenode>& List2){
List1.lastPtr->nextPtr=List2.firstPtr->nextPtr;
List1.lastPtr=List2.lastPtr;
}
при выводе на печать функция зависает. Функция печати поочередно с первого элемента проходит по узлам списка, используя указатели nextPtr. Функцию печати вызываю для List1.print();
Помогите понять, что я делаю не правильно? Почему программа зависает?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.11.2016, 11:58
Ответы с готовыми решениями:

Объединение двух списков
Помогите пожалуйста с решением следующей задачи. Нужно добавить функцию для объединения двух...

Найти объединение двух списков
Помогите мне решить задачку, я в принципе не понимаю как её решать, вот её условие. Найти...

Объединение (конкатенация) двух односвязных списков
Задача: Построить стек (односвязный список). Показать реализацию стека на следующем примере:...

Объединение двух связанных списков (нужен совет)
шаблон ListNode #pragma once // оголошення, щоб зробити другом template&lt; typename NODETYPE &gt;...

19
230 / 113 / 79
Регистрация: 17.10.2016
Сообщений: 312
06.11.2016, 12:36 2
Нужно так: указателю на следующий элемент последнего узла первого списка присвоить
указатель на первый элемент второго списка
C++
1
2
3
4
template <class typenode>
void concatenate(List<typenode>& List1, List<typenode>& List2){
List1.lastPtr->nextPtr=List2.firstPtr;
}
0
1 / 1 / 0
Регистрация: 07.10.2015
Сообщений: 96
07.11.2016, 12:56  [ТС] 3
Сделал как вы рекомендовали, врезультате функция печати зациклилась. Пока не разобрался почему.
0
230 / 113 / 79
Регистрация: 17.10.2016
Сообщений: 312
07.11.2016, 14:51 4
перед своим ответом сделал проверку.
как видишь всё работает
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
#include <iostream>
 
struct node {
    int data;
    node* next;
};
class SimpleList
{
node* head;
public:
 
    SimpleList()
    {
        head = NULL;
    }
 
    ~SimpleList()
    {
       ClearList();
    }
void ClearList()
    {
        node* current = head;
        while (current != NULL)
        {
            node* tmp = current->next;
            delete current;
            current = tmp;
        }       
        head = NULL;
    }
void Push( int data)
{
    node* newNode = new  node();
    newNode->data = data;
    newNode->next = head; 
    head = newNode;
}
 
 
void Print()
{
    node* current = head;
    while (current != NULL) 
    {
        std::cout << current->data << ' ';
        current = current->next;
    }
}
 
node* GetHead()
{
    return head;
}
node* GetLast()
{
    node* current = head;
    while (current->next != NULL)
    {
        current = current->next;
    }
    return current;
}
};
 
void concatenate( SimpleList & list1, SimpleList & list2)
{
    node* lastNode = list1.GetLast();
    lastNode->next = list2.GetHead();
}
int main() 
{
    SimpleList list1;
    SimpleList list2;
 
    for (size_t i = 5; i >= 1; i--)
    {
        list1.Push(i);
    }
    for (size_t i = 10; i >= 6; i--)
    {
        list2.Push(i);
    }
    std::cout << "First list:" << std::endl;
    list1.Print();
     std::cout << "\nSecond list:" << std::endl;
     list2.Print();
     std::cout << std::endl;
 
     concatenate(list1, list2);
     std::cout << "First list after concatenate:" << std::endl;
     list1.Print();
}
out :
First list:
1 2 3 4 5
Second list:
6 7 8 9 10
First list after concatenate:
1 2 3 4 5 6 7 8 9 10
0
1 / 1 / 0
Регистрация: 07.10.2015
Сообщений: 96
07.11.2016, 20:07  [ТС] 5
Код узла списка
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef LISTNODE_H_
#define LISTNODE_H_
template <class NODETYPE> class List;
 
template <class NODETYPE>
class ListNode{
    friend class List<NODETYPE>;
public:
    ListNode(const NODETYPE &);
    NODETYPE getData()const;
private:
    NODETYPE data;
    ListNode <NODETYPE> *nextPtr;
};
 
template<class NODETYPE>
ListNode <NODETYPE>::ListNode(const NODETYPE & info): data(info), nextPtr(0){}
 
template <class NODETYPE>
NODETYPE ListNode <NODETYPE>::getData()const{return data;}
#endif /* LISTNODE_H_ */
Код списка
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
#ifndef LIST_H_
#define LIST_H_
#include <iostream>
#include <cassert>
#include "ListNode.h"
 
using std::cout;
 
template<class NODETYPE>
 
class List{
    friend void contenace(List<NODETYPE>&,List<NODETYPE>&);
public:
    List();
    ~List();
    void insertAtFront(const NODETYPE &);
    void insertAtBack(const NODETYPE &);
    bool removeFromFront(NODETYPE &);
    bool removeFromBack(NODETYPE &);
    void contenace(List<NODETYPE>&,List<NODETYPE>&);
    ListNode <NODETYPE> * getNextPtr();
    bool isEmpty()const;
    void print()const;
private:
    ListNode <NODETYPE>* firstPtr;
    ListNode <NODETYPE>* lastPtr;
    ListNode <NODETYPE>* getNewNode(const NODETYPE &);
};
 
 
//конструктор
template <class NODETYPE>
List<NODETYPE>::List():firstPtr(0),lastPtr(0){}
//деструктор
template<class NODETYPE>
List<NODETYPE>::~List(){
    if(!isEmpty()){
        cout<<"удаление узлов....\n";
    }
    ListNode<NODETYPE> *currentPtr=firstPtr, *tempPtr;
    while(!currentPtr==0){
        tempPtr=currentPtr;
        cout<<currentPtr->data<<"\n";
        currentPtr=currentPtr->nextPtr;
        delete tempPtr;
    }
    cout<<"Все узлы удалены \n\n";
}
 
//вставить узел в начало списка
template <class NODETYPE>
void List<NODETYPE>::insertAtFront(const NODETYPE &value){
    ListNode<NODETYPE>* newPtr=getNewNode(value);
    if(isEmpty()){
        firstPtr=lastPtr=newPtr;
    }
    else{
    newPtr->nextPtr=firstPtr;
    firstPtr=newPtr;
    }
}
//вставить узел в конец списка
template <class NODETYPE>
void List<NODETYPE>::insertAtBack(const NODETYPE & value){
    ListNode<NODETYPE> *newPtr=getNewNode(value);
    if(isEmpty()){
        firstPtr=lastPtr=newPtr;
    }else
    {
        lastPtr->nextPtr=newPtr;
        lastPtr=newPtr;
    }
}
//удаление первого элемента
template<class NODETYPE>
bool List<NODETYPE>::removeFromFront(NODETYPE & value){
    if(isEmpty()){
        return false;
    }
    else{
        ListNode <NODETYPE> *tempPtr=firstPtr;
        if(firstPtr==lastPtr){
            firstPtr=lastPtr=0;
        }
        else{
            firstPtr=firstPtr->nextPtr;
        }
        value=tempPtr->data;
        delete tempPtr;
        return true;
    }
}
//удаление объекта с конца списка
template<class NODETYPE>
bool List<NODETYPE>::removeFromBack(NODETYPE & value){
 
    if(isEmpty()){
        return false;
    }
    else{
        ListNode<NODETYPE> *tempPtr=lastPtr;
        if(firstPtr==lastPtr){
            firstPtr=lastPtr=0;
        }
        else{
            ListNode<NODETYPE> *currentPtr=firstPtr;
            while(currentPtr->nextPtr!=lastPtr){
                lastPtr=currentPtr;
                lastPtr->nextPtr=0;
            }
        }
        value=tempPtr->data;
        delete tempPtr;
        return true;
    }
 
}
//создание нового обекта ListNode
template <class NODETYPE>
ListNode<NODETYPE>*List<NODETYPE>::getNewNode(const NODETYPE & value){
    ListNode<NODETYPE> *ptr=new ListNode<NODETYPE>(value);
    assert(ptr!=0);
    return ptr;
}
//проверка пуст ли список
template <class NODETYPE>
bool List<NODETYPE>::isEmpty()const{
    return firstPtr==0;
}
//печать списка
template<class NODETYPE>
void List<NODETYPE>::print()const{
    if(isEmpty()){cout<<"Список пуст \n"; return;}
 
    cout<<"Список элементов списка: \n";
    ListNode<NODETYPE>* tempPtr=firstPtr;
    while(tempPtr!=0){
        cout<<tempPtr->data<<" ";
        tempPtr=tempPtr->nextPtr;
        }
    cout<<"\n\n";
}
//функция получения указателя на следующий элемент последнего элемента списка
template<class NODETYPE>
ListNode <NODETYPE> * List<NODETYPE>::getNextPtr(){
    ListNode <NODETYPE> *current=lastPtr->nextPtr;
    return current;
}
//дружественная функция контенации
void contenace(List<NODETYPE>& List1,List<NODETYPE>& List2){
 List1.getNextPtr()=List2.firstPtr; //получить доступ к указателю nextPtr последнего элемента списка List1 и присвоить ему указтле firstPtr списка List2;
 List1.lastPtr=List2.lastPtr;  //присвоить lastPtr списка List1, lastPtr списка List2
}
#endif /* LIST_H_ */
код исполняемого файла
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
#include <iostream>
using namespace std;
#include "List.h"
int main() {
    List<char> L1;
    List<char>L2;
    char X;
    cout<<"введите 5 значений 1го листа \n";
    for(int i=0; i<5; i++){
        cin>>X;
        L1.insertAtBack(X);
    }
    cout<<"\n";
    cout<<"введите 5 значений 2го листа";
        for(int i=0; i<5; i++){
            cin>>X;
            L2.insertAtBack(X);
        }
    cout<<"\n";
    cout<<"элементы L1+L2 \n";
    contenace(L1,L2);
    L1.print();
    return 0;
}
Что выдает компилятор
17:44:35 **** Incremental Build of configuration Debug for project List ****
Info: Internal Builder is used for build
g++ -O0 -g3 -Wall -c -fmessage-length=0 -o "src\\List.o" "..\\src\\List.cpp"
In file included from ..\src\List.cpp:11:0:
..\src\List.h:12:55: warning: friend declaration 'void contenace(List<NODETYPE>&, List<NODETYPE>&)' declares a non-template function [-Wnon-template-friend]
friend void contenace(List<NODETYPE>&,List<NODETYPE>&);
^
..\src\List.h:12:55: note: (if this is not what you intended, make sure the function template has already been declared and add <> after the function name here)
..\src\List.h:148:21: error: 'NODETYPE' was not declared in this scope
void contenace(List<NODETYPE>& List1,List<NODETYPE>& List2){
^
..\src\List.h:148:29: error: template argument 1 is invalid
void contenace(List<NODETYPE>& List1,List<NODETYPE>& List2){
^
..\src\List.h:148:43: error: 'NODETYPE' was not declared in this scope
void contenace(List<NODETYPE>& List1,List<NODETYPE>& List2){
^
..\src\List.h:148:51: error: template argument 1 is invalid
void contenace(List<NODETYPE>& List1,List<NODETYPE>& List2){
^
..\src\List.h: In function 'void contenace(int&, int&)':
..\src\List.h:149:8: error: request for member 'getNextPtr' in 'List1', which is of non-class type 'int'
List1.getNextPtr()=List2.firstPtr;//получить доступ к указателю nextPtr последнего элемента списка List1 и присвоить ему указтле firstPtr списка List2;
^
..\src\List.h:149:27: error: request for member 'firstPtr' in 'List2', which is of non-class type 'int'
List1.getNextPtr()=List2.firstPtr;//получить доступ к указателю nextPtr последнего элемента списка List1 и присвоить ему указтле firstPtr списка List2;
^
In file included from ..\src\List.cpp:11:0:
..\src\List.h:150:8: error: request for member 'lastPtr' in 'List1', which is of non-class type 'int'
List1.lastPtr=List2.lastPtr;
^
..\src\List.h:150:22: error: request for member 'lastPtr' in 'List2', which is of non-class type 'int'
List1.lastPtr=List2.lastPtr;
^

Добавлено через 30 минут
Кое-что исправил объявил шаблон функции вот так.
C++
1
2
3
4
5
template <class typef>
void contenace(List<typef>& List1,List<typef>& List2){
 List1.getNextPtr()=List2.firstPtr; //получить доступ к указателю nextPtr последнего элемента списка List1 и присвоить ему указателе firstPtr списка List2;
 List1.lastPtr=List2.lastPtr;  //присвоить lastPtr списка List1, lastPtr списка List2
}
Компилятор выдает следующее.
18:19:17 **** Incremental Build of configuration Debug for project List ****
Info: Internal Builder is used for build
g++ -O0 -g3 -Wall -c -fmessage-length=0 -o "src\\List.o" "..\\src\\List.cpp"
In file included from ..\src\List.cpp:11:0:
..\src\List.h:12:55: warning: friend declaration 'void contenace(List<NODETYPE>&, List<NODETYPE>&)' declares a non-template function [-Wnon-template-friend]
friend void contenace(List<NODETYPE>&,List<NODETYPE>&);
^
..\src\List.h:12:55: note: (if this is not what you intended, make sure the function template has already been declared and add <> after the function name here)
g++ -o List.exe "src\\List.o"
src\List.o: In function `main':
C:\Users\fireod\workspace\List\Debug/../src/List.cpp:29: undefined reference to `contenace(List<char>&, List<char>&)'
collect2.exe: error: ld returned 1 exit status

Добавлено через 47 минут
Перенес функцию
C++
1
2
3
4
5
template <class typef>
void contenace(List<typef>& List1,List<typef>& List2){
 List1.getNextPtr()=List2.firstPtr; //получить доступ к указателю nextPtr последнего элемента списка List1 и присвоить ему указателе firstPtr списка List2;
 List1.lastPtr=List2.lastPtr;  //присвоить lastPtr списка List1, lastPtr списка List2
}
в 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
27
28
29
30
#include <iostream>
using namespace std;
#include "List.h"
 
template <class typef>
void contenace(List<typef>& List1,List<typef>& List2){
 List1.getNextPtr()=List2.firstPtr; //получить доступ к указателю nextPtr последнего элемента списка List1 и присвоить ему указтле firstPtr списка List2;
 List1.lastPtr=List2.lastPtr;  //присвоить lastPtr списка List1, lastPtr списка List2
}
int main() {
    List<char> L1;
    List<char>L2;
    char X;
    cout<<"введите 5 значений 1го листа \n";
    for(int i=0; i<5; i++){
        cin>>X;
        L1.insertAtBack(X);
    }
    cout<<"\n";
    cout<<"введите 5 значений 2го листа";
        for(int i=0; i<5; i++){
            cin>>X;
            L2.insertAtBack(X);
        }
    cout<<"\n";
    cout<<"элементы L1+L2 \n";
    contenace(L1,L2);
    L1.print();
    return 0;
}
Компилятор все-равно ругается
19:07:22 **** Incremental Build of configuration Debug for project List ****
Info: Internal Builder is used for build
g++ -O0 -g3 -Wall -c -fmessage-length=0 -o "src\\List.o" "..\\src\\List.cpp"
In file included from ..\src\List.cpp:11:0:
..\src\List.h:12:55: warning: friend declaration 'void contenace(List<NODETYPE>&, List<NODETYPE>&)' declares a non-template function [-Wnon-template-friend]
friend void contenace(List<NODETYPE>&,List<NODETYPE>&);
^
..\src\List.h:12:55: note: (if this is not what you intended, make sure the function template has already been declared and add <> after the function name here)
g++ -o List.exe "src\\List.o"
src\List.o: In function `main':
C:\Users\fireod\workspace\List\Debug/../src/List.cpp:35: undefined reference to `contenace(List<char>&, List<char>&)'
collect2.exe: error: ld returned 1 exit status

Добавлено через 58 минут
Переделал код List.h, пожалуйста протестите. Опять не работает функция контенации, хотя компилятор не выдает ошибок.
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
#ifndef LIST_H_
#define LIST_H_
#include <iostream>
#include <cassert>
#include "ListNode.h"
 
using std::cout;
 
template<class NODETYPE>
 
class List{
 
public:
    List();
    ~List();
    void insertAtFront(const NODETYPE &);
    void insertAtBack(const NODETYPE &);
    bool removeFromFront(NODETYPE &);
    bool removeFromBack(NODETYPE &);
    void contenace(List<NODETYPE>&);
    ListNode <NODETYPE> * getNextPtr();
    bool isEmpty()const;
    void print()const;
private:
    ListNode <NODETYPE>* firstPtr;
    ListNode <NODETYPE>* lastPtr;
    ListNode <NODETYPE>* getNewNode(const NODETYPE &);
};
 
 
//конструктор
template <class NODETYPE>
List<NODETYPE>::List():firstPtr(0),lastPtr(0){}
//деструктор
template<class NODETYPE>
List<NODETYPE>::~List(){
    if(!isEmpty()){
        cout<<"удаление узлов....\n";
    }
    ListNode<NODETYPE> *currentPtr=firstPtr, *tempPtr;
    while(!currentPtr==0){
        tempPtr=currentPtr;
        cout<<currentPtr->data<<"\n";
        currentPtr=currentPtr->nextPtr;
        delete tempPtr;
    }
    cout<<"Все узлы удалены \n\n";
}
 
//вставить узел в начало списка
template <class NODETYPE>
void List<NODETYPE>::insertAtFront(const NODETYPE &value){
    ListNode<NODETYPE>* newPtr=getNewNode(value);
    if(isEmpty()){
        firstPtr=lastPtr=newPtr;
    }
    else{
    newPtr->nextPtr=firstPtr;
    firstPtr=newPtr;
    }
}
//вставить узел в конец списка
template <class NODETYPE>
void List<NODETYPE>::insertAtBack(const NODETYPE & value){
    ListNode<NODETYPE> *newPtr=getNewNode(value);
    if(isEmpty()){
        firstPtr=lastPtr=newPtr;
    }else
    {
        lastPtr->nextPtr=newPtr;
        lastPtr=newPtr;
    }
}
//удаление первого элемента
template<class NODETYPE>
bool List<NODETYPE>::removeFromFront(NODETYPE & value){
    if(isEmpty()){
        return false;
    }
    else{
        ListNode <NODETYPE> *tempPtr=firstPtr;
        if(firstPtr==lastPtr){
            firstPtr=lastPtr=0;
        }
        else{
            firstPtr=firstPtr->nextPtr;
        }
        value=tempPtr->data;
        delete tempPtr;
        return true;
    }
}
//удаление объекта с конца списка
template<class NODETYPE>
bool List<NODETYPE>::removeFromBack(NODETYPE & value){
 
    if(isEmpty()){
        return false;
    }
    else{
        ListNode<NODETYPE> *tempPtr=lastPtr;
        if(firstPtr==lastPtr){
            firstPtr=lastPtr=0;
        }
        else{
            ListNode<NODETYPE> *currentPtr=firstPtr;
            while(currentPtr->nextPtr!=lastPtr){
                lastPtr=currentPtr;
                lastPtr->nextPtr=0;
            }
        }
        value=tempPtr->data;
        delete tempPtr;
        return true;
    }
 
}
//создание нового обекта ListNode
template <class NODETYPE>
ListNode<NODETYPE>*List<NODETYPE>::getNewNode(const NODETYPE & value){
    ListNode<NODETYPE> *ptr=new ListNode<NODETYPE>(value);
    assert(ptr!=0);
    return ptr;
}
//проверка пуст ли список
template <class NODETYPE>
bool List<NODETYPE>::isEmpty()const{
    return firstPtr==0;
}
//печать списка
template<class NODETYPE>
void List<NODETYPE>::print()const{
    if(isEmpty()){cout<<"Список пуст \n"; return;}
 
    cout<<"Список элементов списка: \n";
    ListNode<NODETYPE>* tempPtr=firstPtr;
    while(tempPtr!=0){
        cout<<tempPtr->data<<" ";
        tempPtr=tempPtr->nextPtr;
        }
    cout<<"\n\n";
}
//функция получения указателя на следующий элемент последнего элемента списка
template<class NODETYPE>
ListNode <NODETYPE> * List<NODETYPE>::getNextPtr(){
    ListNode <NODETYPE> *current=lastPtr->nextPtr;
    return current;
}
//функция контенации
template<class NODETYPE>
void List<NODETYPE>::contenace(List<NODETYPE>& L2){
    (*this).lastPtr->nextPtr=L2.firstPtr;
    (*this).lastPtr=L2.lastPtr;
}
#endif /* LIST_H_ */
0
230 / 113 / 79
Регистрация: 17.10.2016
Сообщений: 312
07.11.2016, 20:39 6
Попытался по исправлять
http://ideone.com/ydH64A

Вывод:
первый список: a b c d e

второй список: f g j k l

L1+L2 : a b c d e f g j k l

удаление:
clear list....
All nodes removed

clear list....
All nodes removed

Вот этих функций нет в коде
C++
1
2
bool removeFromFront(NODETYPE &);
    bool removeFromBack(NODETYPE &);
сам попробуй исправить.
0
1 / 1 / 0
Регистрация: 07.10.2015
Сообщений: 96
08.11.2016, 18:34  [ТС] 7
скопировал полностью ваш код из присланной вами ссылки все-равно не работает, просто зависает, на двух компьютерах пробовал, не получается(((((((((

Добавлено через 1 минуту
Виндовс выдает.
Сигнатура проблемы:
Имя события проблемы: APPCRASH
Имя приложения: Test.exe
Версия приложения: 0.0.0.0
Отметка времени приложения: 5821f045
Имя модуля с ошибкой: StackHash_f021
Версия модуля с ошибкой: 6.1.7600.16385
Отметка времени модуля с ошибкой: 4a5be02b
Код исключения: c0000374
Смещение исключения: 00000000000c6cd2
Версия ОС: 6.1.7600.2.0.0.256.48
Код языка: 1049
Дополнительные сведения 1: f021
Дополнительные сведения 2: f021b07d285e08e247eccef281954147
Дополнительные сведения 3: 227f
Дополнительные сведения 4: 227f3348b2c29f38796e23bb7b3978c0
0
230 / 113 / 79
Регистрация: 17.10.2016
Сообщений: 312
09.11.2016, 00:15 8
Maximum_001, разбей задание на подзадачи:
Первое: сделай простую си-подобную реализацию списка.
пока без классов, но главное рабочую.
Второе: оберни функции в класс.
Третье: сделай свой список обобщенным.
Цитата Сообщение от Maximum_001 Посмотреть сообщение
ваш код все-равно не работает
Возьми вариант который у тебя работает. Большая коллекция решенных задач
0
1 / 1 / 0
Регистрация: 07.10.2015
Сообщений: 96
09.11.2016, 14:31  [ТС] 9
Спасибо, попробую, поизучав гугл пришол к выводу что это проблема операцинки.
0
1 / 1 / 0
Регистрация: 07.10.2015
Сообщений: 96
09.11.2016, 18:59  [ТС] 10
Запустил просто файл .exe получил вот это:
Миниатюры
Объединение двух связных списков с объектами одного типа  
0
1 / 1 / 0
Регистрация: 07.10.2015
Сообщений: 96
09.11.2016, 19:00  [ТС] 11
Это значит, что программа запускается успешно, а проблема возникает при удалении данных второго листа.
0
230 / 113 / 79
Регистрация: 17.10.2016
Сообщений: 312
09.11.2016, 20:56 12
Лучший ответ Сообщение было отмечено Maximum_001 как решение

Решение

Цитата Сообщение от Maximum_001 Посмотреть сообщение
Это значит, что программа запускается успешно, а проблема возникает при удалении данных второго листа.
Точно,Maximum_001, эт мой косяк, не подумал.
Сначала удаляется второй список, потом первый и упс...
половина первого уже была удалена.


Добавь метод ClearList.
Вызови его в конце программы для первого списка.
Для второго соответственно не нужно.

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
template<class NODETYPE>
 
class List {
public:
    List();
       ~List();
        CearList();
.........................
...........................
 
//деструктор
template<class NODETYPE>
List<NODETYPE>::~List() {
    ClearList();
}
template<class NODETYPE>
void List<NODETYPE>::CearList() {
    if (!isEmpty()) {
        cout << "clear list....\n";
    }
    ListNode<NODETYPE> *currentPtr = firstPtr, *tempPtr;
 
    while (currentPtr != 0)
    {
        tempPtr = currentPtr->GetNextPtr();
        delete currentPtr;
        currentPtr = tempPtr;
    }
    firstPtr = 0;
    cout << "All nodes removed \n\n";
}
 
int main() {
 
    ........
 
    contenace<char>(L1, L2);
    L1.print();
    L1.CearList();
    return 0;
}
1
1 / 1 / 0
Регистрация: 07.10.2015
Сообщений: 96
09.11.2016, 21:02  [ТС] 13
все заработало, только метод clearList() вызывается для второго списка, если вызывать его для первого, то выскакивает та же ошибка.

Добавлено через 32 секунды
Огромное спасибо за помощь!!!

Добавлено через 3 минуты
Я извиняюсь, может вопрос не по теме, но получается, что после завершения программы в динамической памяти данные так и остаются? Ведь лист указатель которого мы перенаправили не удаляется.
0
230 / 113 / 79
Регистрация: 17.10.2016
Сообщений: 312
09.11.2016, 21:02 14
странно. у меня нормально.
0
1 / 1 / 0
Регистрация: 07.10.2015
Сообщений: 96
09.11.2016, 21:07  [ТС] 15
У меня операционка WIN7x64, да и вопрос про память? как вы думаете, она так и остается задействованной, значит происходит утечка.
0
230 / 113 / 79
Регистрация: 17.10.2016
Сообщений: 312
09.11.2016, 21:09 16
да какая разница какая операционка..
где утечки ? ) нам не нужны утечки.
0
1 / 1 / 0
Регистрация: 07.10.2015
Сообщений: 96
09.11.2016, 21:15  [ТС] 17
List1 так и остается в памяти.
0
230 / 113 / 79
Регистрация: 17.10.2016
Сообщений: 312
09.11.2016, 21:22 18
не знаю. ничего не остается.
после ClearList вызови Print получишь сообщение "Empty"
Там для второго списка деструктор вызывается.
Деструктор убрать нафиг, да и всё.
0
1 / 1 / 0
Регистрация: 07.10.2015
Сообщений: 96
11.11.2016, 18:15  [ТС] 19
Дополнение. Для полного удаления элементов и предотвращения утечки памяти необходимо вызывать функцию clearList(), для первого листа.
0
1 / 1 / 0
Регистрация: 07.10.2015
Сообщений: 96
12.11.2016, 20:49  [ТС] 20
Может быть это лишнее. Но для полного понимания. Попытаюсь объяснить почему появлялась ошибка. Причина появления ошибки заключалась в следующем, так как удаление элементов списка производилось деструктором, то деструкторы созданных листов запускались в порядке создания этих листов, следовательно вначале удалялся список №1, в связи с чем так как мы применили функцию контенации указатель в его последнем элементе стал указывать на первый элемент списка №2.
Поэтому при запуске деструктора для списка №1 все элементы были удалены, после чего запустился деструктор для списока №2 и тут появляется ошибка, так как указатель на первый элемент (firstPtr) списка №2 теперь указывает на область памяти в которой больше нет объекта узла.
Чтобы не создавать метод для очищения списков, а применять деструктор для удаления объектов, функцию контенации надо переписать так.
C++
1
2
3
4
5
6
7
template<class NODETYPE>
void List<NODETYPE>::concatenate(List<NODETYPE>& List1,List<NODETYPE>& List2){
    List1.lastPtr->nextPtr=List2.firstPtr;
    List1.lastPtr=List2.lastPtr;
    List2.firstPtr=0;
    List2.lastPtr=0;
}
При условии что контенация будет применятся к первому списку. Тогда все будет работать корректно без функции очищения списков.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.11.2016, 20:49
Помогаю со студенческими работами здесь

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

Исследование связных списков данных
Пусть дан список студентов. Элемент списка содержит: фамилию, имя, отчество, № курса, № группы,...

Представление графов с помощью связных списков
Здравствуйте уважаемые форумчане. Помогите мне пожалуйста. Никак не могу понять как представить...

Быстрая сортировка (сортировка Хоара) для связных списков
есть у кого готовый алгоритм? или подскажите как реализовать


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru