Листа суседности (са кодом на Ц, Ц ++, Јава и Питхон)

У овом упутству ћете научити шта је листа суседности. Такође, наћи ћете радне примере листе суседности у Ц, Ц ++, Јава и Питхон.

Листа суседности представља графикон као низ повезаних листа.

Индекс низа представља врх, а сваки елемент на повезаној листи представља остале врхове који са врхом чине ивицу.

Заступљеност списка суседства

Графикон и еквивалентни приказ листе суседства приказани су у наставку.

Заступљеност списка суседства

Листа суседности је ефикасна у погледу складиштења, јер треба да сачувамо само вредности за ивице. За оскудни граф са милионима темена и ивица, ово може значити много уштеде простора.

Структура листе суседства

Најједноставнија листа суседства треба структуру података чворова за чување темена и структуру података графикона за организацију чворова.

Остајемо близу основне дефиниције графа - колекције врхова и ивица (V, E). Ради једноставности користимо необележени граф, за разлику од означеног, односно врхови су идентификовани индексима 0,1,2,3.

Хајде да истражимо структуре података које су овде у игри.

 struct node ( int vertex; struct node* next; ); struct Graph ( int numVertices; struct node** adjLists; );

Не дозволите да вас struct node** adjListsсвлада.

Све што кажемо је да желимо да сачувамо показивач struct node*. То је зато што не знамо колико ће темена графикон имати, па не можемо да креирамо низ повезаних листа у време компајлирања.

Листа суседства Ц ++

То је иста структура, али користећи уграђену листу података СТЛ структура података на Ц ++, чинимо структуру мало чишћом. Такође смо у могућности да апстрахујемо детаље примене.

 class Graph ( int numVertices; list *adjLists; public: Graph(int V); void addEdge(int src, int dest); );

Листа суседства Јава

Јава колекције користимо за чување низа повезаних листа.

 class Graph ( private int numVertices; private LinkedList adjLists(); )

Тип ЛинкедЛист-а се одређује према томе које податке желите да сачувате у њему. За означени графикон, можете да сместите речник уместо целог броја

Листа суседности Питхон

Постоји разлог због којег Питхон добија толико љубави. Једноставан речник темена и његових ивица довољан је приказ графа. Сам врх можете учинити сложеним колико год желите.

 graph = ('A': set(('B', 'C')), 'B': set(('A', 'D', 'E')), 'C': set(('A', 'F')), 'D': set(('B')), 'E': set(('B', 'F')), 'F': set(('C', 'E')))

Примери за Питхон, Јава и Ц / Ц ++

Питхон Јава Ц Ц ++
 # Adjascency List representation in Python class AdjNode: def __init__(self, value): self.vertex = value self.next = None class Graph: def __init__(self, num): self.V = num self.graph = (None) * self.V # Add edges def add_edge(self, s, d): node = AdjNode(d) node.next = self.graph(s) self.graph(s) = node node = AdjNode(s) node.next = self.graph(d) self.graph(d) = node # Print the graph def print_agraph(self): for i in range(self.V): print("Vertex " + str(i) + ":", end="") temp = self.graph(i) while temp: print(" -> ()".format(temp.vertex), end="") temp = temp.next print(" ") if __name__ == "__main__": V = 5 # Create graph and edges graph = Graph(V) graph.add_edge(0, 1) graph.add_edge(0, 2) graph.add_edge(0, 3) graph.add_edge(1, 2) graph.print_agraph()
 // Adjascency List representation in Java import java.util.*; class Graph ( // Add edge static void addEdge(ArrayList  am, int s, int d) ( am.get(s).add(d); am.get(d).add(s); ) public static void main(String() args) ( // Create the graph int V = 5; ArrayList  am = new ArrayList  (V); for (int i = 0; i < V; i++) am.add(new ArrayList()); // Add edges addEdge(am, 0, 1); addEdge(am, 0, 2); addEdge(am, 0, 3); addEdge(am, 1, 2); printGraph(am); ) // Print the graph static void printGraph(ArrayList  am) ( for (int i = 0; i < am.size(); i++) ( System.out.println("Vertex " + i + ":"); for (int j = 0; j " + am.get(i).get(j)); ) System.out.println(); ) ) )    
 // Adjascency List representation in C #include #include struct node ( int vertex; struct node* next; ); struct node* createNode(int); struct Graph ( int numVertices; struct node** adjLists; ); // Create a node struct node* createNode(int v) ( struct node* newNode = malloc(sizeof(struct node)); newNode->vertex = v; newNode->next = NULL; return newNode; ) // Create a graph struct Graph* createAGraph(int vertices) ( struct Graph* graph = malloc(sizeof(struct Graph)); graph->numVertices = vertices; graph->adjLists = malloc(vertices * sizeof(struct node*)); int i; for (i = 0; i adjLists(i) = NULL; return graph; ) // Add edge void addEdge(struct Graph* graph, int s, int d) ( // Add edge from s to d struct node* newNode = createNode(d); newNode->next = graph->adjLists(s); graph->adjLists(s) = newNode; // Add edge from d to s newNode = createNode(s); newNode->next = graph->adjLists(d); graph->adjLists(d) = newNode; ) // Print the graph void printGraph(struct Graph* graph) ( int v; for (v = 0; v numVertices; v++) ( struct node* temp = graph->adjLists(v); printf(" Vertex %d: ", v); while (temp) ( printf("%d -> ", temp->vertex); temp = temp->next; ) printf(""); ) ) int main() ( struct Graph* graph = createAGraph(4); addEdge(graph, 0, 1); addEdge(graph, 0, 2); addEdge(graph, 0, 3); addEdge(graph, 1, 2); printGraph(graph); return 0; )
 // Adjascency List representation in C++ #include using namespace std; // Add edge void addEdge(vector adj(), int s, int d) ( adj(s).push_back(d); adj(d).push_back(s); ) // Print the graph void printGraph(vector adj(), int V) ( for (int d = 0; d < V; ++d) ( cout << " Vertex " << d << ":"; for (auto x : adj(d)) cout < " << x; printf(""); ) ) int main() ( int V = 5; // Create a graph vector adj(V); // Add edges addEdge(adj, 0, 1); addEdge(adj, 0, 2); addEdge(adj, 0, 3); addEdge(adj, 1, 2); printGraph(adj, V); )

Занимљиви Чланци...