Отождествление в списках смежности
Даны графы, нужно с помощью списков смежности произвести отождествление вершин. С помощью матрицы смежности я это сделал, но как со списками не понятно. И нельзя просто перезаписать списки из новой матрицы. Вот функция с матрицей:
void mergeRows(int** arr, int* rows, int rows1, int rows2) {
// Проверка
if (rows1 >= *rows || rows2 >= *rows || rows1 < 0 || rows2 < 0) {
printf("Ошибка: некорректные номера вершин!\n");
return;
}
// Отождествляем вершины путем присвоения им одного и того же значения
for (int i = 0; i < *rows; i++) {
arr[i][rows1] = arr[i][rows1] || arr[i][rows2];
}
for (int i = 0; i < *rows; i++) {
arr[rows1][i] = arr[rows1][i] || arr[rows2][i];
}
// Сдвигаем вершины справа от rows2 на одну позицию влево
for (int i = 0; i < *rows - 1; i++) {
for (int j = rows2; j < *rows - 1; j++) {
arr[i][j] = arr[i][j + 1];
}
}
for (int i = rows2; i < *rows - 1; i++) {
for (int j = 0; j < *rows; j++) {
arr[i][j] = arr[i + 1][j];
}
}
// Уменьшаем количество вершин на 1
(*rows)--;
}
Передаётся двумерный массив, размер матрицы, первая и вторая вершина.
Списки
typedef struct Node {
int inf;
struct Node* next;
}Node;
void addSp(Node** arr_sp, int** arr, int rows) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < rows; j++) {
if (arr[i][j] == 1) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->inf = j + 1;
newNode->next = arr_sp[i];
arr_sp[i] = newNode;
}
}
}
}
void printSp(Node** arr_sp, int rows) {
for (int i = 0; i < rows; i++) {
Node* current = arr_sp[i];
if (current == NULL) {
}
else {
printf("Вершина %d смежна с: ", i + 1);
while (current != NULL) {
printf("%d ", current->inf);
current = current->next;
}
printf("\n");
}
}
}
В main просто выделяется память и создаётся массив, но если нужно могу и его скинуть.