Untitled

 avatar
unknown
plain_text
2 years ago
5.9 kB
5
Indexable
#include <iostream>
using namespace std;
const int n = 20;

struct link {
    int key;
    link* next;
} *gr[n];

void init(link* gr[n]) {
    for (int i = 0; i < n; i++) {
        gr[i] = NULL;
    }
}

int search_node(link* gr[n], int c) {
    int flag = 0;
    for (int i = 0; i < n; i++) {
        if (gr[i]) {
            if (gr[i]->key == c) {
                flag = 1;
                break;
            }
        }
    }
    return flag;
}

int search_arc(link* gr[n], int c1, int c2) {
    int flag = 0;
    if (search_node(gr, c1) && search_node(gr, c2)) {
        int i = 0;
        while (gr[i]->key != c1 || gr[i] == NULL)
            i++;
        link* p = gr[i];
        while (p->key != c2 && p->next != NULL)
            p = p->next;
        if (p->key == c2)
            flag = 1;
    }
    return flag;
}

void add_node(link* gr[n], int c) {
    if (search_node(gr, c)) {
        cout << endl << "Existing node!" << endl;
    }
    else {
        int j = 0;
        while (gr[j] && (j < n))
            j++;
        if (gr[j] == NULL) {
            gr[j] = new link;
            gr[j]->key = c;
            gr[j]->next = NULL;
        }
        else {
            cout << endl << "Overflow!" << endl;
        }
    }
}

void add_arc(link* gr[n], int c1, int c2) {
    int i = 0;
    link* p;
    if (search_arc(gr, c1, c2)) {
        cout << endl << "Existing arc!" << endl;
    }
    else {
        if (!(search_node(gr, c1)))
            add_node(gr, c1);
        if (!(search_node(gr, c2)))
            add_node(gr, c2);
        while (gr[i]->key != c1 || gr[i] == NULL)
            i++;
        p = new link;
        p->key = c2;
        p->next = gr[i]->next;
        gr[i]->next = p;
    }
}

void del_node(link* gr[n], int c) {
    if (search_node(gr, c)) {
        int i = 0;
        while (gr[i]->key != c)
            i++;
        link* p, * q = NULL;
        while (gr[i] != NULL) {
            p = gr[i];
            gr[i] = p->next;
            delete p;
        }
        for (int i = 0; i < n; i++) {
            if (gr[i]) {
                p = gr[i];
                while ((p->key != c) && (p->next != NULL)) {
                    q = p;
                    p = p->next;
                }
                if (p->key == c) {
                    q->next = p->next;
                    delete p;
                }
            }
        }
    }
    else {
        cout << "The node is not in the graph!" << endl;
    }
}

void del_arc(link* gr[n], int c1, int c2) {
    if (search_arc(gr, c1, c2)) {
        int i = 0;
        while (gr[i]->key != c1 || gr[i] == NULL)
            i++;
        link* p = gr[i], * q = NULL;
        while (p->key != c2) {
            q = p;
            p = p->next;
        }
        q->next = p->next;
        delete p;
    }
    else {
        cout << "The arc is not in the graph!" << endl;
    }
}

void print_node(link* gr[n]) {
    for (int i = 0; i < n; i++) {
        if (gr[i]) {
            cout << gr[i]->key;
            link* p = gr[i]->next;
            while (p) {
                cout << "->" << p->key << endl;
                p = p->next;
            }
        }
    }
    cout << endl;
    system("pause");
}

void visualizeAndDeleteLoops(link* gr[n]) {
    cout << endl << "Graph Visualization:" << endl;
    print_node(gr);
    cout << endl;

    // Detect and delete loops
    for (int i = 0; i < n; i++) {
        if (gr[i]) {
            link* p = gr[i]->next;
            link* prev = gr[i];
            while (p) {
                if (p->key == gr[i]->key) {
                    // Delete the loop
                    prev->next = p->next;
                    delete p;
                    p = prev->next;
                }
                else {
                    p = p->next;
                    prev = prev->next;
                }
            }
        }
    }

    cout << "Graph after deleting loops:" << endl;
    print_node(gr);
    cout << endl;
}

int main() {
    int x, y, choice;

    do {
        system("cls");
        cout << endl << "MENU" << endl;
        cout << "1. Initialize graph." << endl;
        cout << "2. Add node." << endl;
        cout << "3. Add arc." << endl;
        cout << "4. Delete node." << endl;
        cout << "5. Delete arc." << endl;
        cout << "6. Print graph." << endl;
        cout << "7. Visualize and delete loops." << endl;
        cout << "8. Exit." << endl;
        cout << "Choose an option: ";
        cin >> choice;

        switch (choice) {
        case 1:
            init(gr);
            break;
        case 2:
            cout << endl << "Enter a node to add: ";
            cin >> x;
            add_node(gr, x);
            break;
        case 3:
            cout << endl << "Enter the origin and destination of the arc to add: ";
            cin >> x >> y;
            add_arc(gr, x, y);
            break;
        case 4:
            cout << endl << "Enter a node to delete: ";
            cin >> x;
            del_node(gr, x);
            break;
        case 5:
            cout << endl << "Enter the origin and destination of the arc to delete: ";
            cin >> x >> y;
            del_arc(gr, x, y);
            break;
        case 6:
            cout << endl << "Graph:" << endl;
            print_node(gr);
            cout << endl;
            break;
        case 7:
            visualizeAndDeleteLoops(gr);
            break;
        case 8:
            cout << endl << "Exiting the program." << endl;
            break;
        default:
            cout << endl << "Invalid option! Please try again." << endl;
            break;
        }
    } while (choice != 8);

    return 0;
}
Editor is loading...