Удаление одинаковых элементов структуры - 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 (прерывание внешнего цикла, если дубликаты не найдены)
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д