-
Notifications
You must be signed in to change notification settings - Fork 0
/
Cherkaskii.c
155 lines (144 loc) · 4.01 KB
/
Cherkaskii.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
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 5
int V = 4;
int G[4][4] = {{0,1,1,1},{1,0,1,0},{1,1,0,1},{1,0,1,0}};
int ROW = 4;
int COL = 4;
int E = 4;
struct AdjListNode
{
int dest;
struct AdjListNode* next;
};
// A structure to represent an adjacency list
struct AdjList
{
struct AdjListNode *head; // pointer to head node of list
};
// A structure to represent a graph. A graph is an array of adjacency lists.
// Size of array will be V (number of vertices in graph)
struct Graph
{
int V;
struct AdjList* array;
};
// A utility function to create a new adjacency list node
struct AdjListNode* newAdjListNode(int dest)
{
struct AdjListNode* newNode =
(struct AdjListNode*) malloc(sizeof(struct AdjListNode));
newNode->dest = dest;
newNode->next = NULL;
return newNode;
}
void addEdge(struct Graph* graph, int src, int dest)
{
// Add an edge from src to dest. A new node is added to the adjacency
// list of src. The node is added at the begining
struct AdjListNode* newNode = newAdjListNode(dest);
newNode->next = graph->array[src].head;
graph->array[src].head = newNode;
// Since graph is undirected, add an edge from dest to src also
newNode = newAdjListNode(src);
newNode->next = graph->array[dest].head;
graph->array[dest].head = newNode;
}
// A utility function that creates a graph of V vertices
struct Graph* createGraph(int V)
{
struct Graph* graph = (struct Graph*) malloc(sizeof(struct Graph));
graph->V = V;
// Create an array of adjacency lists. Size of array will be V
graph->array = (struct AdjList*) malloc(V * sizeof(struct AdjList));
// Initialize each adjacency list as empty by making head as NULL
int i,j;
for (i = 0; i < V; ++i)
graph->array[i].head = NULL;
for(i=1;i<V;i++){
for(j=0;j<i;j++){
if(G[i][j] == 1)
addEdge(graph, i, j);
}
}
return graph;
}
void printGraph(struct Graph* graph)
{
int v;
printf("\n Adjacency list ::\n");
for (v = 0; v < graph->V; ++v)
{
struct AdjListNode* pCrawl = graph->array[v].head;
printf("%d",v);
while (pCrawl)
{
printf("-> %d", pCrawl->dest);
pCrawl = pCrawl->next;
}
printf("\n");
}
}
struct EdgeList{
int startVertex;
int endVertex;
int edgeNumber;
int vertexNumber;
struct EdgeList* next;
}*IN = NULL,*OUT = NULL;
struct EdgeList* newEdge(int src, int dest, int count , int vertexNumber)
{
struct EdgeList* newE = (struct EdgeList*) malloc(sizeof(struct EdgeList));
newE->startVertex = src;
newE->endVertex = dest;
newE->edgeNumber = count;
newE->vertexNumber = vertexNumber;
newE->next = NULL;
return newE;
}
struct EdgeList* createEdgelist(struct Graph* graph){
int i,j,c = 1;
struct EdgeList* E = (struct EdgeList*) malloc(sizeof(struct EdgeList));
struct EdgeList* temp;
for(i=0;i<graph->V;i++){
for(j=0;j<graph->V;j++){
if(G[i][j]!=0 ){
if(c==1){
E->startVertex = i;
E->endVertex = j;
E->edgeNumber = c;
E->vertexNumber = i;
E->next = NULL;
temp = E;
}
else{
temp->next = newEdge(i,j,c,i);
temp = temp->next;
}
c++;
}
}
}
return E;
}
void printEdgelist(struct EdgeList* edge)
{
struct EdgeList* pCrawl = edge;
printf("\n Edge list:\n");
while (pCrawl)
{
printf(" %d", pCrawl->edgeNumber);
printf("\t%d,%d\t%d\n", pCrawl->startVertex, pCrawl->endVertex, pCrawl->vertexNumber);
pCrawl = pCrawl->next;
}
}
main()
{
struct Graph* graph = createGraph(V);
printf("PRINT OF ADJACENCY LSIT OF THE GRAPH \n");
printGraph(graph);
printf("\n");
struct EdgeList* edgeList = createEdgelist(graph);
printEdgelist(edgeList);
return 0;
}