Іршілес тізім диаграмманы байланыстырылған тізім массиві ретінде көрсетеді.
Жиым индексі шыңды және оның байланыстырылған тізіміндегі әрбір элементті көрсетеді, сонымен қатар шыңы бар жиекті құрайтын басқа шыңдарды көрсетеді.
Көршілес тізімді білдіреді
График және оның баламалы іргелестік тізімінің көрінісі төменде көрсетілген.
Іргелестік тізімі сақтауда тиімді, өйткені бізге тек жиектер үшін мәндерді сақтау керек. Миллиондаған шыңдары мен жиектері бар сирек график үшін бұл көп кеңістікті үнемдейді.
Көршілес тізімнің құрылымы
Ең қарапайым іргелес тізім шыңын сақтау үшін түйін деректер құрылымын және түйіндерді ұйымдастыру үшін графикалық деректер құрылымын қажет етеді.
Біз графиктің негізгі анықтамасына жақындап келеміз – {V, E} төбелері мен жиектерінің жиыны. Қарапайымдылық үшін біз таңбаланған емес, таңбаланбаған графикті қолданамыз, яғни шыңдар 0,1,2,3 индекстері арқылы анықталады.
Төмендегі деректер құрылымын қарастырайық.
struct node { int vertex; struct node* next; }; struct Graph { int numVertices; struct node** adjLists; };
Struct node*
adjLists сізді басып кетуіне жол бермеңіз.
Бізге құрылымдық түйін
көрсеткішін сақтау керек. Графикте қанша шың болатынын білмегендіктен, компиляция уақытында байланыстырылған тізімдер жиымын жасай алмаймыз.
Көршілестер тізімі C++
Бұл бірдей құрылым, бірақ C++ жүйесінде STL деректер құрылымдарының кірістірілген тізімімен біз құрылымды біршама таза етеміз. Біз сондай-ақ іске асыру туралы мәліметтерді алып тастай аламыз.
class Graph { int numVertices; list<int> *adjLists; public: Graph(int V); void addEdge(int src, int dest); };
Java іргелес тізімі
Байланыстырылған тізімдер массивін сақтау үшін біз Java Collections пайдаланамыз.
class Graph { private int numVertices; private LinkedList<integer> adjLists[]; }
LinkedList түрі онда сақтағыңыз келетін деректер түрін анықтайды. Белгіленген график үшін бүтін мәннің орнына сөздікті сақтауға болады.
Python іргелестік тізімі
Python-ның «махаббатты» көп алуының себебі бар. Төбелер мен оның жиектерінің қарапайым сөздігі графиктің жеткілікті көрінісі болып табылады. Жоғарғы жағын қалауыңызша күрделі етіп жасауға болады.
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'])}
C іргелес тізім коды
#include <stdio.h> #include <stdlib.h> struct node { int vertex; struct node* next; }; struct node* createNode(int); struct Graph { int numVertices; struct node** adjLists; }; struct Graph* createGraph(int vertices); void addEdge(struct Graph* graph, int src, int dest); void printGraph(struct Graph* graph); int main() { struct Graph* graph = createGraph(6); addEdge(graph, 0, 1); addEdge(graph, 0, 2); addEdge(graph, 1, 2); addEdge(graph, 1, 4); addEdge(graph, 1, 3); addEdge(graph, 2, 4); addEdge(graph, 3, 4); addEdge(graph, 4, 6); addEdge(graph, 5, 1); addEdge(graph, 5, 6); printGraph(graph); return 0; } struct node* createNode(int v) { struct node* newNode = malloc(sizeof(struct node)); newNode->vertex = v; newNode->next = NULL; return newNode; } struct Graph* createGraph(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 < vertices; i++) graph->adjLists[i] = NULL; return graph; } void addEdge(struct Graph* graph, int src, int dest) { // Add edge from src to dest struct node* newNode = createNode(dest); newNode->next = graph->adjLists[src]; graph->adjLists[src] = newNode; // Add edge from dest to src newNode = createNode(src); newNode->next = graph->adjLists[dest]; graph->adjLists[dest] = newNode; } void printGraph(struct Graph* graph) { int v; for (v = 0; v < graph->numVertices; v++) { struct node* temp = graph->adjLists[v]; printf("\n Adjacency list of vertex %d\n ", v); while (temp) { printf("%d -> ", temp->vertex); temp = temp->next; } printf("\n"); } }
C++ іргелес тізім коды
#include <iostream> #include <list> using namespace std; class Graph { int numVertices; list *adjLists; public: Graph(int V); void addEdge(int src, int dest); }; Graph::Graph(int vertices) { numVertices = vertices; adjLists = new list[vertices]; } void Graph::addEdge(int src, int dest) { adjLists[src].push_front(dest); } int main() { Graph g(4); g.addEdge(0, 1); g.addEdge(0, 2); g.addEdge(1, 2); g.addEdge(2, 3); return 0; }
Java іргелес тізім коды
import java.io.*; import java.util.*; class Graph { private int numVertices; private LinkedList<Integer> adjLists[]; Graph(int vertices) { numVertices = vertices; adjLists = new LinkedList[vertices]; for (int i = 0; i < vertices; i++) adjLists[i] = new LinkedList(); } void addEdge(int src, int dest) { adjLists[src].add(dest); } public static void main(String args[]) { Graph g = new Graph(4); g.addEdge(0, 1); g.addEdge(0, 2); g.addEdge(1, 2); g.addEdge(2, 3); } }