У меня есть следующие функции:
Создать график
struct Graph* createGraph(int V) {
struct Graph* graph =
(struct Graph*) malloc(sizeof(struct Graph));
graph->V = V;
graph->array =
(struct AdjList*) malloc(V * sizeof(struct AdjList));
int i;
for (i = 0; i < V; ++i)
graph->array[i].head = NULL;
return graph; }
Добавить ребро
void addEdge(struct Graph* graph, int src, int dest){
struct AdjListNode* newNode = newAdjListNode(dest);
newNode->next = graph->array[src].head;
graph->array[src].head = newNode;
newNode = newAdjListNode(src);
newNode->next = graph->array[dest].head;
graph->array[dest].head = newNode;}
Печать графика
void printGraph(struct Graph* graph){
int v;
for (v = 0; v < graph->V; ++v)
{
struct AdjListNode* pCrawl = graph->array[v].head;
printf("\n Adjacency list of vertex %d head -> ", v);
while (pCrawl)
{
printf("[%d] ", pCrawl->dest);
pCrawl = pCrawl->next;
}
printf("\n"); } }
С помощью этих функций у меня получится следующий правильный вывод:
Adjacency list of vertex 0 head -> [4] [1]
Adjacency list of vertex 1 head -> [4] [3] [2] [0]
Adjacency list of vertex 2 head -> [3] [1]
Adjacency list of vertex 3 head -> [4] [2] [1]
Adjacency list of vertex 4 head -> [3] [1] [0]
Я хочу создать функцию, в которой я смогу подсчитать все ребра на этом графике.
Здесь вы можете увидеть, что общее ребро равно 7
. Я сделал этот код:
int counttotalEdges(struct Graph* graph){
int v,sum;
sum = 0;
for (v = 0; v < graph->V; ++v)
{
struct AdjListNode* pCrawl = graph->array[v].head;
while (pCrawl)
{
sum = sum + 1;
pCrawl = pCrawl->next;
}
}
return sum; }
и вывел:
The total Edges in graph are : 14
, что неверно, поскольку некоторые ребра считаются более одного раза.
Правильный вывод должен быть 7
Как я могу это исправить?