Вы находитесь на странице: 1из 7

#include <stdio.

h>
#include<malloc.h>
int** allocateIncidenceMatrix(int numEdges, int vershina) {
int **num = (int **)malloc(numEdges * sizeof(int *));
for (int i = 0; i < numEdges; ++i) {
num[i] = (int *)malloc(vershina * sizeof(int));
for (int j = 0; j < vershina; ++j) {
num[i][j] = 0; // Инициализация нулями
}
}
return num;
}
int ask() {
int choice;

printf("1-Перевести из матрицы инцидентности \n");


printf("2-Перевести из матрицы смежности \n");
printf("3-Перевести из списка смежности \n");
scanf(" %d", &choice);

return choice;
}
void IncidenceMatrixInput(int numEdges, int vershina,int*p,int **numn) {
int **num =numn;

for (int i = 0; i < numEdges; ++i) {


printf("Ввод для ребра %d: ", i + 1);
for (int j = 0; j < vershina; ++j) {
scanf("%d", &num[i][j]);
}
}

for (int i = 0; i < numEdges; ++i) {


for (int j = 0; j < vershina; ++j) {
printf("%d ", num[i][j]);
}
printf("\n");
}
int b;
printf("1-Перевести в список смежности \n ");
printf("2-Перевести в матрицу смежности \n");
scanf("%d", &b);
*p=b;

}
void AdjacencyMatrixInput( int vershina,int*p,int ** AdjacencyMatrix){
int**matrix= AdjacencyMatrix;
for (int i = 0; i < vershina; ++i) {
printf("Ввод для вершины %d: ", i + 1);
for (int j = 0; j < vershina; ++j) {
scanf("%d", &matrix[i][j]);
}
}

for (int i = 0; i < vershina; ++i) {


for (int j = 0; j < vershina; ++j) {
printf("%d ", matrix[i][j]);
}
printf("\n");
}
int b;
printf("1-Перевести в список смежности \n ");
printf("2-Перевести в матрицу инцидентности \n");
scanf("%d", &b);
*p=b;

}
// Функция для выделения памяти под список смежности
int** allocateAdjacencyList(int vershina) {
int **spisoc_smejnosti = (int **)malloc(vershina * sizeof(int *));
for (int i = 0; i < vershina; ++i) {
spisoc_smejnosti[i] = (int *)malloc(vershina * sizeof(int));
for (int j = 0; j < vershina; ++j) {
spisoc_smejnosti[i][j] = 0; // Инициализация нулями
}
}
return spisoc_smejnosti;
}

void incidenceMatrixToAdjacencyList(int **numm, int vershina, int


numEdges,int **spisoc_smejnostii) {
int **spisoc_smejnosti = spisoc_smejnostii;
int **num = numm;
int d = 0;
for (int i = 0; i < numEdges; ++i) {
for (int j = 0; j < vershina; ++j) {
if (num[i][j] == -1) {
d = j;
for (int k = 0; k < vershina; ++k) {
if (num[i][k] == 1) {
spisoc_smejnosti [d][k] = 1;
}
}
} else if (num[i][j] == 2) {
spisoc_smejnosti [j][j] = 1;
}
}
}

for (int i = 0; i < vershina; ++i) {


printf("Вершина: %d", i + 1);
for (int j = 0; j < vershina; ++j) {
if ( spisoc_smejnosti[i][j] == 1) {
printf(" %d", j + 1);
}
}
printf(" 0\n");
}
}
void incidenceMatrixToAdjacencyMatrix (int **numm, int vershina, int
numEdges,int **spisoc_smejnostii)
{
int **spisoc_smejnosti = spisoc_smejnostii;
int **num = numm;
int d = 0;
for (int i = 0; i < numEdges; ++i) {
for (int j = 0; j < vershina; ++j) {
if (num[i][j] == -1) {
d = j;
for (int k = 0; k < vershina; ++k) {
if (num[i][k] == 1) {
spisoc_smejnosti [d][k] = 1;
}
}
} else if (num[i][j] == 2) {
spisoc_smejnosti [j][j] = 1;
}
}
}
for (int i = 0; i < vershina; ++i) {
for (int j = 0; j < vershina; ++j) {
printf(" %d",spisoc_smejnosti[i][j] );
}
printf("\n");
}
}

void Input_Change(int vershina, int ***num, int *numEdges) {


int change_input;
int edge;
int top_1;
int top_2;

do {
printf("Для изменения значения нажмите 1\n");
printf("Для удаления значения нажмите 2\n");
printf("Для добавления значения нажмите 3\n");
printf("Для завершения программы нажмите 0\n");
scanf("%d", &change_input);

switch (change_input) {
case 1:
printf("Введите ребро, в котором нужно изменить значение: ");
scanf("%d", &edge);
printf("Введите начальную вершину: ");
scanf("%d", &top_1);
printf("Введите конечную вершину: ");
scanf("%d", &top_2);

if (edge >= 1 && edge <= *numEdges) {


for (int i = 0; i < vershina; ++i) {
(*num)[edge - 1][i] = 0;
}
(*num)[edge - 1][top_1 - 1] = -1;
(*num)[edge - 1][top_2 - 1] = 1;
} else {
printf("Введено некорректное значение ребра. Пожалуйста,
повторите ввод.\n");
}
break;

case 2:
printf("Введите ребро, которое нужно убрать: ");
scanf("%d", &edge);

if (edge >= 1 && edge <= *numEdges) {


(*numEdges)--;
for (int i = edge - 1; i < *numEdges; i++) {
(*num)[i] = (*num)[i + 1];
}
int **temp = (int **)realloc(*num, *numEdges * sizeof(int
*));
if (temp != NULL) {
*num = temp;
}

} else {
printf("Введено некорректное значение ребра. Пожалуйста,
повторите ввод.\n");
}
break;
case 3:
(*numEdges)++;

// Перевыделяем память для массива


int **temp = (int **)realloc(*num, *numEdges * sizeof(int
*));
if (temp != NULL) {
*num = temp; // Присваиваем новый адрес указателю num
// Инициализируем новое ребро
(*num)[*numEdges - 1] = (int *)malloc(vershina *
sizeof(int));

// Заполняем новое ребро значениями


printf("Введите начало нового ребра: ");
scanf("%d", &top_1);
printf("Введите конец нового ребра: ");
scanf("%d", &top_2);

for (int i = 0; i < vershina; ++i) {


(*num)[*numEdges - 1][i] = 0;
}
(*num)[*numEdges - 1][top_1 - 1] = -1;
(*num)[*numEdges - 1][top_2 - 1] = 1;
} else {
// Обработка ошибки realloc
printf("Ошибка перевыделения памяти");
exit(EXIT_FAILURE);
}
break;

case 0:
break;

default:
printf("Введено некорректное значение. Пожалуйста, повторите
ввод.\n");
}

} while (change_input != 0);


}
void AdjacencyMatrix_Input_Change(int vershina, int ***adjMatrix) {
int change_input;
int top_1;
int top_2;

do {
printf("Для изменения значения нажмите 1\n");
printf("Для удаления значения нажмите 2\n");
printf("Для добавления значения нажмите 3\n");
printf("Для завершения программы нажмите 0\n");
scanf("%d", &change_input);

switch (change_input) {
case 1:
printf("Введите начальную вершину: ");
scanf("%d", &top_1);
printf("Введите конечную вершину: ");
scanf("%d", &top_2);

if (top_1 >= 1 && top_1 <= vershina && top_2 >= 1 && top_2 <=
vershina) {
printf("Введите новое значение (0 или 1): ");
scanf("%d", &(*adjMatrix)[top_1 - 1][top_2 - 1]);
} else {
printf("Введены некорректные значения вершин. Пожалуйста,
повторите ввод.\n");
}
break;

case 2:
printf("Введите вершину, которую нужно убрать: ");
scanf("%d", &top_1);

if (top_1 >= 1 && top_1 <= vershina) {


for (int i = 0; i < vershina; i++) {
(*adjMatrix)[top_1 - 1][i] = 0;
(*adjMatrix)[i][top_1 - 1] = 0;
}
} else {
printf("Введена некорректная вершина. Пожалуйста,
повторите ввод.\n");
}
break;

case 3:
printf("Введите начальную вершину нового ребра: ");
scanf("%d", &top_1);
printf("Введите конечную вершину нового ребра: ");
scanf("%d", &top_2);

if (top_1 >= 1 && top_1 <= vershina && top_2 >= 1 && top_2 <=
vershina) {
printf("Введите 1 ");
int value;
scanf("%d", &value);
(*adjMatrix)[top_1 - 1][top_2 - 1] = value;
} else {
printf("Введены некорректные значения вершин. Пожалуйста,
повторите ввод.\n");
}
break;

case 0:
break;

default:
printf("Введено некорректное значение. Пожалуйста, повторите
ввод.\n");
}

} while (change_input != 0);


}
int* allocateDynamicArray(int numEdges) {
return (int*)malloc(numEdges * sizeof(int));

}
void adjacencyMatrixToIncedenceMatrix(int**numm,int**adjMatrix,int vershina,
int numEdges){
int **num=numm;
int *dynamicArray = allocateDynamicArray(numEdges);
int k = 0;
int **matrix =adjMatrix ;
for (int i = 0; i < vershina; ++i) {
for (int j = 0; j < vershina; ++j) {
if (matrix[i][j] == 1 ) {
dynamicArray[k] = (i+1) * 10 + (j);
k++;
}
}
}
for (int k = 0; k < numEdges; ++k) {
int i = (dynamicArray[k] / 10)-1;
int j = dynamicArray[k] % 10;
if (i==j) {
num[k][i] = 2;

} else {
num[k][i] = -1;
num[k][j] = 1;
}
}
printf("\nМатрица инцидентности:\n");
for (int i = 0; i < numEdges; ++i) {
for (int j = 0; j < vershina; ++j) {
printf("%d ", num[i][j]);
}
printf("\n");
}

free(dynamicArray);
}

int main() {
system("chcp 65001");
int **num;
int **matrix;
int choice;
int vershina;
int numEdges;
int **spisoc_smejnosti;
choice = ask();
int *p = &choice;
printf("Введите количество вершин ");
scanf("%d", &vershina);
printf("Введите количество ребер ");
scanf("%d", &numEdges);
switch (choice) {
case 1: {
num = allocateIncidenceMatrix(numEdges, vershina);
IncidenceMatrixInput(numEdges, vershina, p, num);
Input_Change(vershina, &num, &numEdges);
for (int i = 0; i < numEdges; ++i) {
for (int j = 0; j < vershina; ++j) {
printf("%d ", num[i][j]);
}
printf("\n");
}
printf("\n");

switch (*p) {
case 1: {
spisoc_smejnosti = allocateAdjacencyList(vershina);
incidenceMatrixToAdjacencyList(num, vershina, numEdges,
spisoc_smejnosti);
break;
}
case 2: {
spisoc_smejnosti = allocateAdjacencyList(vershina);
incidenceMatrixToAdjacencyMatrix(num, vershina, numEdges,
spisoc_smejnosti);
break;
}
}
break;
}
case 2:{
matrix=allocateAdjacencyList( vershina);
AdjacencyMatrixInput( vershina,p,matrix);
AdjacencyMatrix_Input_Change( vershina, &matrix);
for (int i = 0; i < vershina; ++i) {
for (int j = 0; j < vershina; ++j) {
printf("%d ", matrix[i][j]);
}
printf("\n");
}
printf("\n");
switch (*p) {
case 1: {
for (int i = 0; i < vershina; ++i) {
printf("Вершина %d: ", i + 1);
for (int j = 0; j < vershina; ++j) {
if (matrix[i][j] == 1 ) {
printf("%d ", j + 1);
}
}
printf("0\n");
}
break;
}
case 2: {
num = allocateIncidenceMatrix(numEdges, vershina);
adjacencyMatrixToIncedenceMatrix(num,matrix, vershina,
numEdges);

break;
}
}
break;
}
break;
}

return 0;
}

Вам также может понравиться