Удаление одинаковых элементов структуры - C (СИ)
Формулировка задачи:
Здравствуйте. Есть задача, условие такое: разработать структуру, описывающую набор точек на плоскости. Точка описана как отдельная структура, координаты целочисленные. Этот тип данных описать в заголовочном файле PointSet.h
Описать и реализовать функцию, удаляющую дубли точек, т.е. точки с одинаковыми координатами.
Написать программу, в которой пользователю преддлагается определить количество точек в наборе, ввести координаты точек и продемонстрировать работу функции.
Заголовок:
Код:
Что не так с циклом и как реализовать задачу? Я новичок, так что не судите строго мною написанное. Заранее благодарю.
#ifndef POINTSET_H #define POINTSET_H struct point { int x; int y; }; #endif
#include <conio.h> #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include "PointSet1.h" #include <stdlib.h> #include <math.h> int DelSamePts(struct point *m, int n); int main() { int n, i, x, y; printf("vvedite kol-vo tochek:"); scanf("%d", &n); struct point *m; /*massiv iz tochek, tip - structura*/ m=(struct point*)malloc(n*sizeof(struct point)); printf("\nvvedite coordinaty tochek:\n"); for (i=0; i<n; i++) { printf("\npt%d:", i); scanf("%d %d", &x, &y); struct point pt; pt.x = x; pt.y = y; *(m+i) = pt; } for (i=0; i<n; i++) { printf("\n%d %d", m[i].x, m[i].y); } n=DelSamePts(m, n); free(m); return 0; getchar(); } int DelSamePts(struct point *m, int n) { int i, j; for (i=0; i<n; i++) { for (j=i+1; j<n-1; j++) { if (m[i].x==m[j].x && m[i].y==m[j].y) { m[j].x=m[j+1].x; m[j].y=m[j+1].y; n--; } } } printf("\ntochki posle udaleniya dublicatov:\n"); for (i=0; i<n; i++) { printf("%d %d\n", m[i].x, m[i].y); } return(m, n); }
Решение задачи: «Удаление одинаковых элементов структуры»
textual
Листинг программы
for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { if (m[i].x == m[j].x && m[i].y == m[j].y) { for (int t = j; t < n - 1; t++) { // нужно сдвинуть остальные элементы m[t] = m[t+1]; } n--; if (m[i].x == m[j].x && m[i].y == m[j].y) { // если следующий тоже дубль j--; } } } }
Объяснение кода листинга программы
В этом коде мы имеем дело с двумя вложенными циклами. Первый цикл идет по всем элементам массива структур, а второй цикл проверяет, есть ли дубликаты структур в массиве. Если находятся дубликаты, то они удаляются с помощью сдвига элементов массива. В конце каждого цикла проверяется, были ли удалены дубликаты. Если да, то индекс последнего дубликата уменьшается на единицу. Вот список элементов кода с их номерами:
- Объявление переменных:
- n (количество элементов в массиве структур)
- m (массив структур)
- Внешний цикл, который идет по всем элементам массива структур:
- i (текущий индекс внешнего цикла)
- Внутренний цикл, который проверяет наличие дубликатов структур в массиве:
- j (текущий индекс внутреннего цикла)
- m[i].x, m[i].y (текущие значения структуры на текущем индексе внешнего цикла)
- Условие проверки на дубликаты структур:
- m[i].x == m[j].x && m[i].y == m[j].y (структуры равны)
- Если найдены дубликаты структур, то происходит сдвиг элементов массива:
- for (int t = j; t < n - 1; t++) (сдвиг элементов)
- m[t] = m[t+1] (замена элементов)
- for (int t = j; t < n - 1; t++) (сдвиг элементов)
- Удаление дубликата из массива:
- n-- (уменьшение размера массива)
- Если после сдвига элементов найдены дубликаты структур, то индекс последнего дубликата уменьшается на единицу:
- j-- (уменьшение индекса)
- Конец внутреннего цикла:
- break (прерывание внутреннего цикла, если дубликаты не найдены)
- Конец внешнего цикла:
- break (прерывание внешнего цикла, если дубликаты не найдены)
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д