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

ООП. Вложенные структуры. Двунаправленные списки - C++

Восстановить пароль Регистрация
 
onlwork
1 / 1 / 0
Регистрация: 10.11.2013
Сообщений: 53
26.04.2014, 11:20     ООП. Вложенные структуры. Двунаправленные списки #1
Доброго времени суток, помогите мне пожалуйста:

Структура (header)
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
#include <stdio.h>
class CGraph {
private:
    struct Graph{
        int mainVertex;
        Graph * nextMainVertex;
        Graph * prevMainVertex;
        int numberVertex;
 
        Graph(int newMainVertex, Graph *newNextMainVertex = NULL, Graph *newPrevMainVertex = NULL)
        {
            mainVertex = newMainVertex; 
            nextMainVertex = newNextMainVertex;
            prevMainVertex = newPrevMainVertex;
            numberVertex = 0;
        }
        struct adjacentVertex{
            int Vertex;
            adjacentVertex * nextAdjacentVertex;
            adjacentVertex * prevtAdjacentVertex;
 
            adjacentVertex(int newVertex, adjacentVertex *newNextAdjacentVertex = NULL, 
                adjacentVertex *prevNextAdjacentVertex = NULL)
            {
                Vertex = newVertex; 
                nextAdjacentVertex = newNextAdjacentVertex;
                prevtAdjacentVertex = prevNextAdjacentVertex;
            }
    };
        adjacentVertex *adjacentVertexEl;
};
 
    Graph *head, *tail;
    Graph::adjacentVertex *ahead, *atail;
 
    int GnumberVertex;
public:
    CGraph():head(NULL), tail(NULL), ahead(NULL), atail(NULL){}
 
    void addMainVertex(int mainVertex);
    void addAdjacentVertex(int mainVertex, int adjacentVertex);
    void printGraph();
    //int getNumberVertex(int Vertex);
    void setGnumberVertex(int GnumberVertex);
    void setNullGnumberVertex(int GnumberVertex);
    int getGnumberVertex();
 
};
Реализация заголовочного файла

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
#pragma one;
#include "stdafx.h"
#include "structGraph.h"
#include <iostream>
 
void CGraph::addMainVertex (int mainVertex)
{   if(CGraph::GnumberVertex < 0)
    {
        this -> setNullGnumberVertex(0);
    }
    Graph *newGraph = new Graph(mainVertex);
    //newGraph -> mainVertex = mainVertex;
    this -> setGnumberVertex(1);
    newGraph -> numberVertex = CGraph::GnumberVertex;
    if(!head)
    {
        newGraph -> nextMainVertex = NULL; 
        tail = newGraph;
    }
    else
    {
        newGraph -> nextMainVertex = head;
        head -> prevMainVertex = newGraph;
    }
 
    newGraph -> prevMainVertex = NULL;
    head = newGraph;
}
 
void CGraph::addAdjacentVertex (int mainVertex, int adjacentVertex)
{
    Graph *graph = head;
    for(int iter = 1; iter<= CGraph::GnumberVertex; iter++){
        if(graph -> mainVertex == mainVertex)
        {
            graph -> adjacentVertexEl = new Graph::adjacentVertex(adjacentVertex);
    //Graph::adjacentVertex *newAdjacentVertex = new Graph::adjacentVertex(adjacentVertex);
            //graph -> adjacentVertexEl -> Vertex = adjacentVertex;
            if(!ahead)
            {
                graph -> adjacentVertexEl -> nextAdjacentVertex = NULL; 
                atail = graph -> adjacentVertexEl;
            }
            else
            {
                graph -> adjacentVertexEl -> nextAdjacentVertex = ahead;
                ahead -> prevtAdjacentVertex = graph -> adjacentVertexEl;
            }
 
            graph -> adjacentVertexEl -> prevtAdjacentVertex = NULL;
            ahead = graph -> adjacentVertexEl;
        }
        graph = graph -> nextMainVertex;
    }
}
 
void CGraph::printGraph()
{
 Graph *graph = head;
 while(graph)
 {
     graph -> adjacentVertexEl = ahead;
     std::cout<<graph -> mainVertex<<" : ";
 
     while(graph -> adjacentVertexEl)
     {
          std::cout<<graph -> adjacentVertexEl -> Vertex<<" ";
          graph -> adjacentVertexEl = graph -> adjacentVertexEl -> nextAdjacentVertex;
     }
 
     graph = graph -> nextMainVertex;
     std::cout<<std::endl;
 }
}
 
//int CGraph::getNumberVertex (int vertex)
//{
//  Graph *graph = head;
//  while(graph){
//      if(graph -> mainVertex == vertex)
//      {
//          return graph -> numberVertex;
//      }
//  }
//  return 0;
//}
 
void CGraph::setGnumberVertex(int GnumberVertex)
{
    CGraph::GnumberVertex += GnumberVertex;
}
 
void CGraph::setNullGnumberVertex(int GnumberVertex = 0)
{
    CGraph::GnumberVertex = GnumberVertex;
}
 
int CGraph::getGnumberVertex()
{
    return CGraph::GnumberVertex;
}
И 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
// componentGraph.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include "structGraph.h"
#include <iostream>
 
void main()
{
    CGraph tx;
    tx.addMainVertex(5);
    tx.addAdjacentVertex(5,4);
    tx.addMainVertex(2);
    tx.addAdjacentVertex(2,8);
    tx.addMainVertex(3);
    tx.addAdjacentVertex(3,9);
 
    std::cout<<tx.getGnumberVertex();
    std::cout<<std::endl;
    tx.printGraph();
 
    //return 0;
}
Функцией addMainVertex я добавляю вершину в граф.
addAdjacentVertex - я добавляю к вершине - смежную вершину 1ый параметр сама вершина 2 - смежная
printGraph - распечатывает и в ней как раз таки ошибка, а может где - то раньше, но я предполагаю что именно тут. При распечатке выдает:
3: 9 8 4
2: 9 8 4
5: 9 8 4

а должно вот так :
3: 9
2: 8
5: 4

За ранее спасибо
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.04.2014, 11:20     ООП. Вложенные структуры. Двунаправленные списки
Посмотрите здесь:

Ссылки, вложенные структуры C++
C++ Двунаправленные списки
работа со списками(двунаправленные списки) C++
двунаправленные списки С++ C++
C++ массивы и вложенные структуры
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
TheAlpha
6 / 6 / 2
Регистрация: 03.01.2013
Сообщений: 114
26.04.2014, 14:14     ООП. Вложенные структуры. Двунаправленные списки #2
Да, наверное у Вас где - то ошибка...
RQdan
65 / 65 / 17
Регистрация: 26.10.2013
Сообщений: 198
26.04.2014, 16:37     ООП. Вложенные структуры. Двунаправленные списки #3
Ошибка, по-моему, в header'e в этой строке:
Цитата Сообщение от onlwork Посмотреть сообщение
Graph::adjacentVertex *ahead, *atail;
объявление должно быть внутри структуры Graph, а не вне его. Из-за этого создается отдельный список, куда записываются все смежные вершины.
onlwork
1 / 1 / 0
Регистрация: 10.11.2013
Сообщений: 53
26.04.2014, 17:32  [ТС]     ООП. Вложенные структуры. Двунаправленные списки #4
RQdan, А как мне их потом в конструктор передать ?
TheAlpha
6 / 6 / 2
Регистрация: 03.01.2013
Сообщений: 114
26.04.2014, 21:04     ООП. Вложенные структуры. Двунаправленные списки #5
Смотри....браток...когда меня увели я вот значит код сочинил, там значит строки такие:
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
struct Graph{
        int mainVertex;
        Graph * nextMainVertex;
        Graph * prevMainVertex;
        int numberVertex;
 
        struct adjacentVertex{
            int Vertex;
            adjacentVertex * nextAdjacentVertex;
            adjacentVertex * prevtAdjacentVertex;
 
            adjacentVertex(int newVertex, adjacentVertex *newNextAdjacentVertex = NULL, 
                adjacentVertex *prevNextAdjacentVertex = NULL)
            {
                Vertex = newVertex; 
                nextAdjacentVertex = newNextAdjacentVertex;
                prevtAdjacentVertex = prevNextAdjacentVertex;
            }
    };
        adjacentVertex *ahead, *atail;
        adjacentVertex *adjacentVertexEl;
        
            Graph(int newMainVertex, Graph *newNextMainVertex = NULL, Graph *newPrevMainVertex = NULL,
                adjacentVertex *newAhead = NULL, adjacentVertex *newAtail = NULL)
        {
            mainVertex = newMainVertex; 
            nextMainVertex = newNextMainVertex;
            prevMainVertex = newPrevMainVertex;
            ahead = newAhead;
            atail = newAtail;
            numberVertex = 0;
        }
};
RQdan
65 / 65 / 17
Регистрация: 26.10.2013
Сообщений: 198
26.04.2014, 23:05     ООП. Вложенные структуры. Двунаправленные списки #6
Цитата Сообщение от onlwork Посмотреть сообщение
RQdan, А как мне их потом в конструктор передать ?
Вопрос только один: зачем?
Насколько я понимаю atail и ahead нужны только внутри структуры и для каждой вершины они свои. В конструктор их нет смысла передавать - достаточно лишь указать вершину и в процесе обработки занулить atail и ahead для этой вершины. При добавлении/удалении смежной вершины тоже достаточно передавать только соответствуюзую вершину и значение добавляемой/удаляемой смежной - больше ничего.
Yandex
Объявления
26.04.2014, 23:05     ООП. Вложенные структуры. Двунаправленные списки
Ответ Создать тему
Опции темы

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