Академический Документы
Профессиональный Документы
Культура Документы
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;
return choice;
}
void IncidenceMatrixInput(int numEdges, int vershina,int*p,int **numn) {
int **num =numn;
}
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]);
}
}
}
// Функция для выделения памяти под список смежности
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;
}
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);
case 2:
printf("Введите ребро, которое нужно убрать: ");
scanf("%d", &edge);
} else {
printf("Введено некорректное значение ребра. Пожалуйста,
повторите ввод.\n");
}
break;
case 3:
(*numEdges)++;
case 0:
break;
default:
printf("Введено некорректное значение. Пожалуйста, повторите
ввод.\n");
}
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);
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");
}
}
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;
}