Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <locale.h>
- #include <string.h>
- // Функция для ввода размера графа
- int inputGraphSize() {
- int n;
- printf("Введите количество вершин графа в диапазоне [2; 7]: ");
- scanf("%d", &n);
- return n;
- }
- // Функция для выделения памяти под матрицу смежности
- int** allocateAdjacencyMatrix(int n) {
- int** matrix = (int**)malloc(n * sizeof(int*));
- for (int i = 0; i < n; i++)
- matrix[i] = (int*)malloc(n * sizeof(int));
- return matrix;
- }
- // Функция для ввода матрицы смежности
- void inputAdjacencyMatrix(int n, int** matrix) {
- printf("Матрица смежности c размерностью n x n\n");
- for (int i = 0; i < n; i++) {
- for (int j = i; j < n; j++) {
- printf("matrix[%d][%d]=", i, j);
- scanf("%d", &matrix[i][j]);
- matrix[j][i] = matrix[i][j];
- }
- }
- }
- // Функция для вывода матрицы смежности
- void printAdjacencyMatrix(int n, int** matrix) {
- printf("Вывод матрицы смежности\n");
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++) {
- printf("%d\t", matrix[i][j]);
- }
- printf("\n");
- }
- }
- // Функция для ввода номера вершины для удаления
- int inputVertexToRemove() {
- int s;
- printf("Введите номер вершины s, которую надо удалить: ");
- scanf("%d", &s);
- return s;
- }
- // Функция для выделения памяти под новую матрицу смежности
- int** allocateNewMatrix(int n) {
- int** matrix = (int**)malloc((n - 1) * sizeof(int*));
- for (int i = 0; i < n - 1; i++)
- matrix[i] = (int*)malloc((n - 1) * sizeof(int));
- return matrix;
- }
- // Функция для удаления вершины из матрицы смежности
- void removeVertex(int n, int** originalMatrix, int** newMatrix, int s) {
- for (int i = 0; i < n - 1; i++) {
- for (int j = i; j < n - 1; j++) {
- if (i < s - 1 && j < s - 1) {
- newMatrix[i][j] = originalMatrix[i][j];
- newMatrix[j][i] = originalMatrix[j][i];
- }
- else if (i < s - 1 && j >= s - 1) {
- newMatrix[i][j] = originalMatrix[i][j + 1];
- newMatrix[j][i] = originalMatrix[j + 1][i];
- }
- else if (j >= s - 1 && i >= s - 1) {
- newMatrix[i][j] = originalMatrix[i + 1][j + 1];
- newMatrix[j][i] = originalMatrix[j + 1][i + 1];
- }
- }
- }
- }
- // Функция для освобождения памяти
- void freeMatrix(int n, int** matrix) {
- for (int i = 0; i < n; i++) {
- free(matrix[i]);
- }
- free(matrix);
- }
- // Функция для ввода матрицы смежности из файла
- void inputAdjacencyMatrixFromFile(int n, int** matrix, const char* fileName) {
- FILE* inputFile = fopen(fileName, "r");
- if (inputFile == NULL) {
- printf("Ошибка открытия файла %s.\n", fileName);
- exit(1);
- }
- for (int i = 0; i < n; i++) {
- for (int j = i; j < n; j++) {
- fscanf(inputFile, "%d", &matrix[i][j]);
- matrix[j][i] = matrix[i][j];
- }
- }
- fclose(inputFile);
- }
- int main() {
- setlocale(LC_ALL, "Russian");
- // Справка
- printf("\nАлгоритм работы программы:\n");
- printf("1. Пользователь выбирает источник данных: клавиатура или файл (input.txt).\n");
- printf("2. В зависимости от выбора, программа либо запрашивает ввод размера графа и матрицы смежности с клавиатуры,\n");
- printf(" либо считывает данные из файла input.txt.\n");
- printf("3. Программа выводит матрицу смежности.\n");
- printf("4. Пользователь вводит номер вершины для удаления.\n");
- printf("5. Программа удаляет выбранную вершину и выводит новую матрицу смежности.\n");
- printf("6. Память, выделенная под матрицы, освобождается.\n");
- printf("\nАвтор: Павликова Екатерина, группа ПМИ-13\n");
- // Шаг 1: Выбор источника данных
- int choice;
- printf("Выберите источник данных: 1 - Клавиатура, 2 - Файл (input.txt)\n");
- scanf("%d", &choice);
- // Переменные для размера графа и матриц
- int n;
- int** m1;
- int** m2;
- // Добавленная переменная fileName
- char fileName[30];
- // Шаг 2: Ввод размера графа
- if (choice == 1) {
- n = inputGraphSize();
- }
- else if (choice == 2) {
- // Чтение из файла
- int fileChoice;
- printf("Выберите файл: 1 - input1.txt, 2 - input2.txt, 3 - input3.txt\n");
- scanf("%d", &fileChoice);
- // Блок switch без изменений
- switch (fileChoice) {
- case 1:
- strcpy(fileName, "input1.txt");
- break;
- case 2:
- strcpy(fileName, "input2.txt");
- break;
- case 3:
- strcpy(fileName, "input3.txt");
- break;
- default:
- printf("Неверный выбор файла. Выход...\n");
- return 1;
- }
- FILE* inputFile = fopen(fileName, "r");
- if (inputFile == NULL) {
- printf("Ошибка открытия файла %s.\n", fileName);
- return 1;
- }
- fscanf(inputFile, "%d", &n);
- fclose(inputFile);
- }
- else {
- printf("Неверный выбор. Выход...\n");
- return 1;
- }
- // Шаг 3: Выделение памяти под матрицу смежности
- m1 = allocateAdjacencyMatrix(n);
- // Шаг 4: Ввод матрицы смежности
- if (choice == 1) {
- // Ввод с клавиатуры
- inputAdjacencyMatrix(n, m1);
- }
- else if (choice == 2) {
- // Ввод из файла
- inputAdjacencyMatrixFromFile(n, m1, fileName);
- }
- // Шаг 5: Вывод матрицы смежности
- printAdjacencyMatrix(n, m1);
- // Шаг 6: Ввод номера вершины для удаления
- int s = inputVertexToRemove();
- // Шаг 7: Выделение памяти для новой матрицы смежности
- m2 = allocateNewMatrix(n);
- // Шаг 8: Удаление вершины из матрицы смежности
- removeVertex(n, m1, m2, s);
- // Шаг 9: Вывод новой матрицы смежности
- printAdjacencyMatrix(n - 1, m2);
- // Шаг 10: Освобождение памяти
- freeMatrix(n, m1);
- freeMatrix(n - 1, m2);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement