Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 22.11.2013
Сообщений: 14
1

Упорядоченный связный список объектов класса

09.10.2015, 21:31. Показов 1565. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер, вот уже третий день бьюсь в попытках создания связного списка из объектов класса.
Задача: создать таблицу символов, в которой последние должны хранится в виде связного списка (в алфавитном порядке).
Когда создаю обычный список все работает, подставляю класс и ожидаемого результата не получаю
Кликните здесь для просмотра всего текста

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
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
// IdentifierTable.cpp: определяет точку входа для консольного приложения.
//
#define _CRT_SECURE_NO_WARNINGS
#include "stdafx.h"
#include <string>
#include <conio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
 
class Identifier {
    
private:
    int ID;
    string name;
    string other;
    
 
public:
    Identifier *next;
 
    int getID(){ 
        return ID; 
    };
    string getName(){
        return name;
    };
    string getOther(){
        return other;
    }
 
    void setID(int id){
        ID = id;
        return;
    };
    void setName(string Name){
        name = Name;
        return;
    };
    void setOther(string Other){
        other = Other;
        return;
    };
};
 
class SymbolTable {
private:
    Identifier *Identifiers;
    int pos = 0;
    Identifier **pBegin=NULL,**last=NULL,*old;
public:
    SymbolTable(int count){
        Identifiers = new Identifier[count];
        Identifiers = NULL;
    };
 
    Identifier GetIdentifier(int id){
        return Identifiers[id];
    };
 
    /*
    void AddIdentifier(Identifier *i){
        //Identifier *p
        //Identifier *old;
        Identifiers = start;
        if (!Identifiers) { 
            i->next = NULL;
            //last = i;
            Identifiers = i;
            start = i;
            return;
} 
 
        old = NULL;
        while (Identifiers) {
            if (Identifiers->getName() > i->getName()) {
                old = Identifiers;
                Identifiers = Identifiers->next;
            }
            else {
                if (old) { 
                    old->next = i;
                    //i->next = Identifiers;
                    Identifiers = i;
                    return;
                }
                //i->next = Identifiers; 
                Identifiers = i;
                start = i;
                return;
            }
        }
        (last)->next = i;
        i->next = NULL;
        //last = i;
        Identifiers = i;
    
        
    };
*/
 
    void sls_store(Identifier  *i)
    {
        Identifier  *old;
 
        if (!Identifiers) { /* первый элемент в списке */
            i->next = NULL;
            Identifiers = i;
            return;
        }
 
        old = NULL;
        while (Identifiers) {
            if (Identifiers->getName() < i->getName()) {
                old = Identifiers;
                Identifiers = Identifiers->next;
            }
            else {
                if (old) { /* вставка в середину */
                    old->next = i;
                    i->next = Identifiers;
                    return;
                }
                i->next = Identifiers; /* вставка в начало */
                Identifiers[0] = *i;
                return;
            }
        }
        (Identifiers)->next = i; /* вставка в конец */
        i->next = NULL;
        *last = i;
    };
    
 
    void Insert( int id, string Name, string other)
    {
        pBegin = &Identifiers;
        Identifier *i = NULL;
        unsigned char flag = 0;
        if (Name <= (*pBegin)->getName()) /* вставить перед первым */
        {
            //p = malloc(sizeof(*p));
            //p->Data = a;
            //p->next = (*pBegin);
 
            Identifiers->setID(id);
            Identifiers->setName(Name);
            Identifiers->setOther(other);
            *pBegin = Identifiers;
        }
        else
        {
            i = (*pBegin);
            /* ищем позицию для вставки */
            while ((flag == 0) && (i->next != NULL))
            {
                if ((i->getName()<Name) && (i->next->getName() >= Name)) flag = 1;
                i = i->next;
            }
            if (flag == 0) /* позиция не найдена - вставить в конец */
            {
                /*p = malloc(sizeof(*p));
                p->Data = a;
                p->next = NULL;*/
                Identifiers->setID(id);
                Identifiers->setName(Name);
                Identifiers->setOther(other);
                Identifiers->next = NULL;
                *pBegin = Identifiers;
                i->next = Identifiers;
            }
            else /* позиция в середине найдена */
            {
                /*p = malloc(sizeof(*p));
                p->Data = a;
                p->next = i->next;*/
                Identifiers->setID(id);
                Identifiers->setName(Name);
                Identifiers->setOther(other);
                Identifiers->next = i->next;
                i->next = Identifiers;
            }
        }
    }
 
    void showIdentifier(int n){
 
 
        cout << Identifiers[n].getID() << endl;
        cout << Identifiers[n].getName() << endl;
        cout << Identifiers[n].getOther() << endl;
    };
 
 
    void display()
    {
        while (Identifiers) {
            cout << Identifiers->getName() << endl;
            cout << "next: " << Identifiers->next->getName() << endl;
        }
    }
 
 
    };
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    SymbolTable table(30);
 
    Identifier *nI=NULL,*start=0,*last=0;
    nI = new Identifier;
    for (int i = 0; i < 10; i++){
        
        char tst[5];
        string test;
        _itoa(i, tst, 10);
        test = (const char*)tst;
        nI->setID(i);
        nI->setName("a"+test);
        nI->setOther("other");
        table.Insert( i, "a" + test, "other");
        //table.AddIdentifier(nI);
        //table.sls_store(nI);
    };
    /*table.AddIdentifier("b", "two");
    table.AddIdentifier("lol", "three");*/
    /*for (int j = 0; j < 10;j++)
    table.showIdentifier(j);*/
    table.display();
 
    return 0;
}

Пытался решить задачу по примерам связных списков взятых из трех различных источников (методы AddIdentifier,sls_store, Insert)
Думаю проблема кроется в недостаточном умении использования указателей)
Прошу помощи довести метод вставки до рабочего состояния.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.10.2015, 21:31
Ответы с готовыми решениями:

Связный список объектов
Добрый день, необходимо было реализовать иерархию кадры, администрация, инженер, рабочий и ...

Связный список (Используя структуру описания даты, построить связный список студентов, сформированный в алфавитном порядке)
Здраствуйте! Помогите пожалуйста найти косяк. Выводится только первая строчка из списка студентов....

Статические методы класса. (Связный список)
Добрый день, такая проблема, работаю со связным списком. Учусь. С обычными типами данных всё...

Связный список как часть друго класса
всем привет. общая задача написать систему для управления колледжем с классами: College,...

3
495 / 377 / 136
Регистрация: 27.01.2015
Сообщений: 1,588
09.10.2015, 22:29 2
Цитата Сообщение от grelik Посмотреть сообщение
void setID(int id){
* * * * ID = id;
* * * * return;
* * };
зачем тут return;?


Цитата Сообщение от grelik Посмотреть сообщение
int pos = 0;
так нельзя инициализировать, только в конструкторе.
Цитата Сообщение от grelik Посмотреть сообщение
Identifier **pBegin=NULL,**last=NULL,*old;
та же фигня.


Цитата Сообщение от grelik Посмотреть сообщение
SymbolTable(int count){
* * * * Identifiers = new Identifier[count];
* * * * Identifiers = NULL;
* * };
втф тут происходит? сначала создал массив указателей, а потом ссылку на ноль??????!!!

Добавлено через 2 минуты
все остальное чтению не подлежит, но на будущее: память выделяется, но не удаляется!
1
0 / 0 / 0
Регистрация: 22.11.2013
Сообщений: 14
10.10.2015, 21:27  [ТС] 3
Вышеуказанные ошибки исправил и все же хотелось бы привести метод sls_store к рабочему виду, может быть кто нибудь поможет или скинет ссылочку на пример где производится вставка в упорядоченный список объектов
0
838 / 641 / 940
Регистрация: 26.06.2015
Сообщений: 1,409
11.10.2015, 09:27 4
grelik, вот накидал пример сортированного односвязного списка и по нему сделаешь своё задание.
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
#include <iostream>
#include <string>
 
template<typename T>
struct snode {
    T      val;
    snode* next;
};
 
template<typename T>
class sorted_list {
    typedef snode<T> node;
private:
    node*  lst;
    size_t cnt;
public:
    sorted_list(void):lst(NULL), cnt(0){}
    ~sorted_list(){
        this->clear();
    }
public:
    
    //вставка
    bool add(const T& val){
        node* prv = lst, *ptr = lst;
 
        while(ptr != NULL){
            if(val < ptr->val)
                break;
            else {
                if(val == ptr->val)
                    break;
            }
            prv = ptr;
            ptr = ptr->next;
        }
 
        node* p = new (std::nothrow) node();
        if(p != NULL){
            p->val = val;
 
            if(ptr == lst){
                p->next = lst;
                lst     = p;
            } else {
                p->next   = ptr;
                prv->next = p;
            }
            ++cnt;
        }
        return (p != NULL);
    }
 
    //удаление по текущей позиции
    node* erase(node* pos){
        node* prv = lst, *ptr = lst;
        while((ptr != pos) && (ptr != NULL)){
            prv = ptr;
            ptr = ptr->next;
        }
 
        if(ptr == NULL)
            return pos;
        else if(ptr == lst)
            prv = lst = lst->next;
        else {
            prv->next = ptr->next;
            prv = prv->next;
        }
        --cnt;
        delete pos;
        return prv;
    }
 
    //удаление всех
    void clear(void){
        node* tmp;
        while(lst != NULL){
            tmp = lst;
            lst = lst->next;
            delete tmp;
        }
    }
 
    node*  begin(void) { return lst; }
    node*  begin(void) const { return lst; }
    bool   empty(void) const { return (lst == NULL); }
    size_t size(void)  const { return cnt; }
};
 
//персона
struct person {
    std::string name;
    std::string city;
    int         age;
 
    person(void){}
    person(const char* _name, const char* _city, int _age):
    name(_name), city(_city), age(_age){}
 
    bool operator == (const person& p) const {
        return (name == p.name);
    }
 
    bool operator < (const person& p) const {
        return (name < p.name);
    }
};
 
 
int main(void){
    sorted_list<person> lp;
    lp.add( person("Вася",  "Самара", 38) );
    lp.add( person("Петя",  "Киров",  42) );
    lp.add( person("Лёха",  "Орёл",   30) );
    lp.add( person("Витя",  "Томск",  27) );
    lp.add( person("Саня",  "Курган", 33) );
    lp.add( person("Толя",  "Курск",  45) );
    lp.add( person("Стёпа", "Якутск", 31) );
 
    snode<person>* p = lp.begin();
    while(p != NULL){ // удалить всех старше 40-ка лет
        if(p->val.age > 40){
            p = lp.erase(p);
            continue;
        }
        p = p->next;
    }
 
    for(p = lp.begin(); p != NULL; p = p->next){
        std::cout << "имя: \t"   << p->val.name << std::endl;
        std::cout << "город: \t" << p->val.city << std::endl;
        std::cout << "возраст: " << p->val.age  << std::endl << std::endl;
    }
    lp.clear();
    return 0;
}
Пример работы кода
0
11.10.2015, 09:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.10.2015, 09:27
Помогаю со студенческими работами здесь

Конструктор копий для шаблонного класса(связный список)
Не совсем понятно как копировать объекты из динамической памяти, в частности правильная реализация...

Список из объектов класса
Здравствуйте, возник вопрос- Как правильно сделать двунаправленный список( не циклический) из...

Список объектов класса
Всем добрый день. Допустим есть класс. class Test { public: void Add() { ... } } void...

Бесконечный список объектов класса?
В данный момент изучаю тему Классы и пробую практиковаться.:) И недавно возник вопрос: как сделать...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru