Удаление одинаковых элементов структуры - 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--;
            }
        }
    }
}

Объяснение кода листинга программы

В этом коде мы имеем дело с двумя вложенными циклами. Первый цикл идет по всем элементам массива структур, а второй цикл проверяет, есть ли дубликаты структур в массиве. Если находятся дубликаты, то они удаляются с помощью сдвига элементов массива. В конце каждого цикла проверяется, были ли удалены дубликаты. Если да, то индекс последнего дубликата уменьшается на единицу. Вот список элементов кода с их номерами:

  1. Объявление переменных:
    • n (количество элементов в массиве структур)
    • m (массив структур)
  2. Внешний цикл, который идет по всем элементам массива структур:
    • i (текущий индекс внешнего цикла)
  3. Внутренний цикл, который проверяет наличие дубликатов структур в массиве:
    • j (текущий индекс внутреннего цикла)
    • m[i].x, m[i].y (текущие значения структуры на текущем индексе внешнего цикла)
  4. Условие проверки на дубликаты структур:
    • m[i].x == m[j].x && m[i].y == m[j].y (структуры равны)
  5. Если найдены дубликаты структур, то происходит сдвиг элементов массива:
    • for (int t = j; t < n - 1; t++) (сдвиг элементов)
      • m[t] = m[t+1] (замена элементов)
  6. Удаление дубликата из массива:
    • n-- (уменьшение размера массива)
  7. Если после сдвига элементов найдены дубликаты структур, то индекс последнего дубликата уменьшается на единицу:
    • j-- (уменьшение индекса)
  8. Конец внутреннего цикла:
    • break (прерывание внутреннего цикла, если дубликаты не найдены)
  9. Конец внешнего цикла:
    • break (прерывание внешнего цикла, если дубликаты не найдены)

Оцени полезность:

12   голосов , оценка 3.75 из 5
Похожие ответы