البرمجة

تطبيق بناء مصفوفة الجوار في C++

عند النظر إلى الكود الذي قدمته، يبدو أن هناك عدة مشاكل في تخصيص الذاكرة باستخدام malloc في الجزء الذي يقوم بإنشاء مصفوفة الجوار. دعوني أشرح لك الأخطاء وأقدم لك بعض التوجيهات حول كيفية إصلاحها.

  1. استخدام malloc بشكل غير صحيح:
    في السطر:

    cpp
    g->adj = (int**)malloc(sizeof(int) * sizeof(g->v * g->v ));

    تحاول تخصيص مساحة ذاكرة لمصفوفة ثنائية الأبعاد باستخدام malloc، ولكن الطريقة التي تقوم بها ليست صحيحة. يجب عليك تخصيص مساحة ذاكرة تكفي لتخزين v صفوف، كل منها يحتوي على v عنصر. يمكنك القيام بذلك بالطريقة التالية:

    cpp
    g->adj = (int**)malloc(g->v * sizeof(int*)); for (int i = 0; i < g->v; ++i) { g->adj[i] = (int*)malloc(g->v * sizeof(int)); }
  2. خطأ في الحلقات التكرارية:
    في الحلقات التكرارية التي تقوم بتهيئة قيم المصفوفة adj، يجب أن تتراوح الفهرسات من 0 إلى g->v - 1، لكنك استخدمت <= g->v، مما قد يؤدي إلى الوصول إلى مواقع غير معتمدة ذاتيًا. يجب تغيير هذه الحلقات إلى:

    cpp
    for (u = 0; u < g->v; ++u) for (V = 0; V < g->v; ++V) g->adj[u][V] = 0;
  3. خطأ في إدخال البيانات:
    في الحلقة التي تقوم بإدخال بيانات الارتباط، تستخدم <= g->e بدلاً من < g->e، مما يمكن أن يؤدي إلى قراءة بيانات زائدة وتجاوز حجم المصفوفة المخصصة. يجب تغيير هذه الحلقة إلى:

    cpp
    for (i = 0; i < g->e; ++i) { cin >> u; cin >> V; g->adj[u][V] = 1; g->adj[V][u] = 1; }

بعد إجراء هذه التغييرات، يجب أن يعمل الكود بشكل صحيح دون وجود أخطاء تخصيص ذاكرة أو وصول غير صحيح. يمكنك الآن تجربة تشغيل الكود مرة أخرى ويجب أن يعمل بشكل صحيح.

المزيد من المعلومات

بالطبع، سأقدم لك المزيد من المعلومات حول كيفية عمل بعض الجوانب في الكود، بالإضافة إلى توجيهات حول كيفية تحسينه.

  1. فصل دالة البناء عن الكائن الرئيسي:
    في الكود الحالي، قمت بتنفيذ بناء الكائن داخل دالة graph مباشرةً. بدلاً من ذلك، يمكنك فصل بناء الكائن إلى دالة منفصلة. هذا يجعل الكود أكثر تنظيمًا وسهولة قراءة، ويسمح بإمكانية استخدام الكائن بشكل أفضل في المستقبل. على سبيل المثال:

    cpp
    class Graph { private: int v, e; int **adj; public: Graph(int vertices, int edges); void addEdge(int u, int v); void displayAdjacencyMatrix(); }; Graph::Graph(int vertices, int edges) : v(vertices), e(edges) { adj = new int*[v]; for (int i = 0; i < v; ++i) { adj[i] = new int[v]; for (int j = 0; j < v; ++j) { adj[i][j] = 0; } } cout << "Enter connections:\n"; int u, v; for (int i = 0; i < e; ++i) { cin >> u >> v; addEdge(u, v); addEdge(v, u); // Assuming an undirected graph } } void Graph::addEdge(int u, int v) { adj[u][v] = 1; } void Graph::displayAdjacencyMatrix() { cout << "Adjacency Matrix:\n"; for (int i = 0; i < v; ++i) { for (int j = 0; j < v; ++j) { cout << adj[i][j] << " "; } cout << endl; } } int main() { int vertices, edges; cout << "Enter number of vertices and edges: "; cin >> vertices >> edges; Graph g(vertices, edges); g.displayAdjacencyMatrix(); return 0; }
  2. إصلاح الحد الأعلى في الحلقات التكرارية:
    يجب أن يتراوح الحد الأعلى في الحلقات التكرارية من 0 إلى v - 1 بدلاً من <= v، حتى لا يتم الوصول إلى عناصر غير معتمدة ذاتيًا.

  3. عرض مصفوفة الجوار:
    تم إضافة دالة displayAdjacencyMatrix() لعرض مصفوفة الجوار. يمكنك استدعاء هذه الدالة لعرض الجوار بشكل منظم.

من خلال تنظيم الكود وإجراء تغييرات صغيرة، يمكنك تحسين القابلية للصيانة والقراءة وفهم كيفية عمل برنامج الرسم البياني.

مقالات ذات صلة

زر الذهاب إلى الأعلى
إغلاق

أنت تستخدم إضافة Adblock

يرجى تعطيل مانع الإعلانات حيث أن موقعنا غير مزعج ولا بأس من عرض الأعلانات لك فهي تعتبر كمصدر دخل لنا و دعم مقدم منك لنا لنستمر في تقديم المحتوى المناسب و المفيد لك فلا تبخل بدعمنا عزيزي الزائر