Удаление одинаковых элементов структуры - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Есть задача, условие такое: разработать структуру, описывающую набор точек на плоскости. Точка описана как отдельная структура, координаты целочисленные. Этот тип данных описать в заголовочном файле PointSet.h Описать и реализовать функцию, удаляющую дубли точек, т.е. точки с одинаковыми координатами. Написать программу, в которой пользователю преддлагается определить количество точек в наборе, ввести координаты точек и продемонстрировать работу функции. Заголовок:
Листинг программы
  1. #ifndef POINTSET_H
  2. #define POINTSET_H
  3. struct point
  4. {
  5. int x;
  6. int y;
  7. };
  8. #endif
Код:
Листинг программы
  1. #include <conio.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <malloc.h>
  5. #include "PointSet1.h"
  6. #include <stdlib.h>
  7. #include <math.h>
  8. int DelSamePts(struct point *m, int n);
  9. int main()
  10. {
  11. int n, i, x, y;
  12. printf("vvedite kol-vo tochek:");
  13. scanf("%d", &n);
  14. struct point *m; /*massiv iz tochek, tip - structura*/
  15. m=(struct point*)malloc(n*sizeof(struct point));
  16.  
  17. printf("\nvvedite coordinaty tochek:\n");
  18. for (i=0; i<n; i++)
  19. {
  20. printf("\npt%d:", i);
  21. scanf("%d %d", &x, &y);
  22. struct point pt;
  23. pt.x = x;
  24. pt.y = y;
  25. *(m+i) = pt;
  26. }
  27. for (i=0; i<n; i++)
  28. {
  29. printf("\n%d %d", m[i].x, m[i].y);
  30. }
  31. n=DelSamePts(m, n);
  32. free(m);
  33. return 0;
  34. getchar();
  35. }
  36. int DelSamePts(struct point *m, int n)
  37. {
  38. int i, j;
  39. for (i=0; i<n; i++)
  40. {
  41. for (j=i+1; j<n-1; j++)
  42. {
  43. if (m[i].x==m[j].x && m[i].y==m[j].y)
  44. {
  45. m[j].x=m[j+1].x;
  46. m[j].y=m[j+1].y;
  47. n--;
  48. }
  49. }
  50. }
  51. printf("\ntochki posle udaleniya dublicatov:\n");
  52. for (i=0; i<n; i++)
  53. {
  54. printf("%d %d\n", m[i].x, m[i].y);
  55. }
  56. return(m, n);
  57. }
Что не так с циклом и как реализовать задачу? Я новичок, так что не судите строго мною написанное. Заранее благодарю.

Решение задачи: «Удаление одинаковых элементов структуры»

textual
Листинг программы
  1. for (int i = 0; i < n; i++) {
  2.     for (int j = i + 1; j < n; j++) {
  3.         if (m[i].x == m[j].x && m[i].y == m[j].y) {
  4.             for (int t = j; t < n - 1; t++) { // нужно сдвинуть остальные элементы
  5.                 m[t] = m[t+1];
  6.             }
  7.             n--;
  8.             if (m[i].x == m[j].x && m[i].y == m[j].y) { // если следующий тоже дубль
  9.                 j--;
  10.             }
  11.         }
  12.     }
  13. }

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

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

  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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы