Advertisement
ksyshshot

Lab_5_1

Mar 31st, 2023 (edited)
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 13.64 KB | Source Code | 0 0
  1. import java.io.File;
  2. import java.io.FileWriter;
  3. import java.io.IOException;
  4. import java.util.Scanner;
  5.  
  6. class Node {
  7.     int data;
  8.     Node next;
  9.  
  10.     public Node(int data, Node next) {
  11.         this.data = data;
  12.         this.next = next;
  13.     }
  14. }
  15.  
  16. class LinkedList {
  17.     public Node head;
  18.  
  19.     public LinkedList(Node head) {
  20.         this.head = head;
  21.     }
  22.  
  23.     public void insertNode(int value) {
  24.         Node newNode = new Node(value, null);
  25.         if (head.next == null) {
  26.             head.next = newNode;
  27.         } else {
  28.             Node currentNode = head.next;
  29.             while (true) {
  30.                 if (currentNode.next == null) {
  31.                     currentNode.next = newNode;
  32.                     return;
  33.                 } else {
  34.                     currentNode = currentNode.next;
  35.                 }
  36.             }
  37.         }
  38.     }
  39.  
  40.     public boolean deleteNode(int value)
  41.     {
  42.         Node curr = head.next;
  43.         if (curr == null) {
  44.             System.out.println("Данный список пуст!");
  45.             return true;
  46.         }
  47.         if (curr.data == value) {
  48.             head.next = curr.next;
  49.             return true;
  50.         }
  51.         while (curr.next != null) {
  52.             if (curr.next.data == value) {
  53.                 curr.next = curr.next.next;
  54.                 return true;
  55.             }
  56.             curr = curr.next;
  57.         }
  58.         if (curr.data == value) {
  59.             curr = null;
  60.             return true;
  61.         }
  62.         return false;
  63.     }
  64.  
  65.     public void printList()
  66.     {
  67.         Node curr = head.next;
  68.         if (curr != null) {
  69.             while (curr != null)
  70.             {
  71.                 System.out.print(curr.data + " ");
  72.                 curr = curr.next;
  73.             }
  74.         } else {
  75.             System.out.print("В списке не найдено элементов!");
  76.         }
  77.     }
  78. }
  79.  
  80. public class Main {
  81.  
  82.     static final int MAX_OPERATION_COUNT = 4;
  83.     static final int MIN_OPERATION_COUNT = 0;
  84.     static final int MIN_DATA = -9999;
  85.     static final int MAX_DATA = 9999;
  86.     static Scanner scan = new Scanner(System.in);
  87.  
  88.     public static void main(String[] args) {
  89.         Node head = new Node(0, null);
  90.         LinkedList list = new LinkedList(head);
  91.         writeTask();
  92.         System.out.println("Получить записи из файла? 1 - да, 2 - нет");
  93.         int choice = chooseInputOutputMethod();
  94.         if (choice == 1) {
  95.             addListFromFile(list);
  96.             System.out.print("Текущий список: ");
  97.             list.printList();
  98.             System.out.println();
  99.         }
  100.         boolean isContinue = true;
  101.         do {
  102.             choice = chooseOperation();
  103.             switch (choice) {
  104.                 case 1:
  105.                     list = addNewElement(list);
  106.                     System.out.print("Текущий список: ");
  107.                     list.printList();
  108.                     System.out.println();
  109.                     break;
  110.                 case 2:
  111.                     list = deleteElement(list);
  112.                     System.out.print("Текущий список: ");
  113.                     list.printList();
  114.                     System.out.println();
  115.                     break;
  116.                 case 3:
  117.                     list = changeList(list);
  118.                     System.out.print("Текущий список: ");
  119.                     list.printList();
  120.                     System.out.println();
  121.                     break;
  122.                 case 4:
  123.                     saveListToFile(list);
  124.                     break;
  125.                 case 0:
  126.                     isContinue = false;
  127.                     break;
  128.             }
  129.         } while (isContinue);
  130.         scan.close();
  131.     }
  132.  
  133.     public static void writeTask() {
  134.         System.out.println("Данная программа работает с односвязным списком.");
  135.         System.out.println("Список операций: 1. Добавление нового элемента.");
  136.         System.out.println("                 2. Удаление элемента.");
  137.         System.out.println("                 3. Добавление после каждого элемента списка предшествующую ему часть.");
  138.         System.out.println("                 4. Сохранение списка в файл.");
  139.         System.out.println("                 0. Завершение работы.");
  140.     }
  141.  
  142.     public static int chooseOperation() {
  143.         int choice = 0;
  144.         boolean isNotCorrect;
  145.         do {
  146.             System.out.println("Введите номер операции, которую необходимо выполнить.");
  147.             isNotCorrect = false;
  148.             try {
  149.                 choice = Integer.parseInt(scan.nextLine());
  150.             } catch (NumberFormatException e) {
  151.                 isNotCorrect = true;
  152.                 System.out.println("Некорректно введён номер операции. Повторите попытку.");
  153.             }
  154.             if ((!isNotCorrect) && (choice > MAX_OPERATION_COUNT || choice < MIN_OPERATION_COUNT)) {
  155.                 isNotCorrect = true;
  156.                 System.out.println("Введён неправильный номер операции. Он должен быть от " + MIN_OPERATION_COUNT + " до " + MAX_OPERATION_COUNT + ". Повторите попытку.");
  157.             }
  158.         } while (isNotCorrect);
  159.         return choice;
  160.     }
  161.  
  162.     public static LinkedList addNewElement(LinkedList list) {
  163.         boolean isNotCorrect;
  164.         int data = 0;
  165.         do {
  166.             isNotCorrect = false;
  167.             System.out.println("Введите элемент, добавляемый в список (от -9999 до 9999)");
  168.             try {
  169.                 data = Integer.parseInt(scan.nextLine());
  170.             } catch (NumberFormatException e) {
  171.                 isNotCorrect = true;
  172.                 System.out.println("Некорректно введено число");
  173.             }
  174.             if ((!isNotCorrect) && (data < MIN_DATA || data > MAX_DATA)) {
  175.                 isNotCorrect = true;
  176.                 System.out.println("Значение элемента должно быть от " + MIN_DATA + " до " + MAX_DATA);
  177.             }
  178.         } while (isNotCorrect);
  179.         list.insertNode(data);
  180.         return list;
  181.     }
  182.  
  183.     public static LinkedList deleteElement(LinkedList list) {
  184.         boolean isNotCorrect;
  185.         int data = 0;
  186.         do {
  187.             isNotCorrect = false;
  188.             System.out.println("Введите элемент, удаляемый из дерева (от -9999 до 9999)");
  189.             try {
  190.                 data = Integer.parseInt(scan.nextLine());
  191.             } catch (NumberFormatException e) {
  192.                 isNotCorrect = true;
  193.                 System.out.println("Некорректно введено число");
  194.             }
  195.             if ((!isNotCorrect) && (data < MIN_DATA || data > MAX_DATA)) {
  196.                 isNotCorrect = true;
  197.                 System.out.println("Номер формата должен быть от " + MIN_DATA + " до " + MAX_DATA);
  198.             }
  199.         } while (isNotCorrect);
  200.         if (!(list.deleteNode(data))) {
  201.             System.out.println("Удаляемый элемент не найден в списке!");
  202.         }
  203.         return list;
  204.     }
  205.  
  206.     public static LinkedList copyList(Node head) {
  207.         Node curr = new Node(head.next.data, head.next.next);
  208.         Node newStart = new Node(0, null);
  209.         LinkedList newList = new LinkedList(newStart);
  210.         while (curr != null) {
  211.             newList.insertNode(curr.data);
  212.             curr = curr.next;
  213.         }
  214.         return newList;
  215.     }
  216.  
  217.     public static Node replaceElement(Node prev, Node next, int value) {
  218.         Node temp = new Node(value, next);
  219.         prev.next = temp;
  220.         return prev;
  221.     }
  222.  
  223.     public static LinkedList changeList(LinkedList oldList) {
  224.         if (oldList.head.next != null) {
  225.             LinkedList newList = copyList(oldList.head);
  226.             Node newStart = new Node(0, newList.head.next);
  227.             Node newElement = new Node(newStart.next.data, newStart.next.next);
  228.             Node curr = oldList.head.next;
  229.             Node temp;
  230.             Node interimNode;
  231.             int newData;
  232.             while (curr != null && newElement != null) {
  233.                 temp = oldList.head.next;
  234.                 newData = oldList.head.next.data;
  235.                 while (temp != curr) {
  236.                     newElement = replaceElement(newElement, newElement.next, newData);
  237.                     newElement = newElement.next;
  238.                     temp = temp.next;
  239.                     if (temp != curr) {
  240.                         newData = temp.data;
  241.                     }
  242.                 }
  243.                 curr = curr.next;
  244.                 newElement = newElement.next;
  245.             }
  246.             return newList;
  247.         } else {
  248.             System.out.println("В списке нет элементов!");
  249.             return oldList;
  250.         }
  251.     }
  252.  
  253.     public static int chooseInputOutputMethod() {
  254.         boolean isNotCorrect;
  255.         int choice = 0;
  256.         do {
  257.             isNotCorrect = false;
  258.             try {
  259.                 choice = Integer.parseInt(scan.nextLine());
  260.             } catch (NumberFormatException e) {
  261.                 System.out.println("Число введено некорректно. Повторите попытку...");
  262.                 isNotCorrect = true;
  263.             }
  264.             if ((!isNotCorrect) && (choice != 1) && (choice != 2)) {
  265.                 System.out.print("Введите либо 1, либо 2. Ваш выбор: ");
  266.                 isNotCorrect = true;
  267.             }
  268.         } while (isNotCorrect);
  269.         return choice;
  270.     }
  271.  
  272.     public static String takePathToFile() {
  273.         String path;
  274.         boolean isNotCorrect;
  275.         do {
  276.             isNotCorrect = false;
  277.             System.out.println("Введите путь к файлу: ");
  278.             path = scan.nextLine();
  279.             File file = new File(path);
  280.             if (!file.exists()) {
  281.                 System.out.println("Не удалось найти файл по заданному пути. Повторите попытку...");
  282.                 isNotCorrect = true;
  283.             }
  284.         } while (isNotCorrect);
  285.         return path;
  286.     }
  287.  
  288.     public static LinkedList addListFromFile(LinkedList oldList) {
  289.         String path;
  290.         boolean isNotCorrect;
  291.         boolean isEmpty = true;
  292.         int element;
  293.         Node head = new Node(0, null);
  294.         LinkedList list = new LinkedList(head);
  295.         do {
  296.             list = oldList;
  297.             path = takePathToFile();
  298.             isNotCorrect = false;
  299.             try (Scanner fileReader = new Scanner(new File(path))) {
  300.                 try {
  301.                     while (fileReader.hasNextLine()) {
  302.                         element = Integer.parseInt(fileReader.nextLine());
  303.                         if ((!isNotCorrect) && (element < MIN_DATA || element > MAX_DATA)) {
  304.                             isNotCorrect = true;
  305.                             System.out.println("Значение элемента должно быть от " + MIN_DATA + " до " + MAX_DATA);
  306.                         }
  307.                         if (!isNotCorrect) {
  308.                             list.insertNode(element);
  309.                             isEmpty = false;
  310.                         }
  311.                     }
  312.                 } catch (NumberFormatException e) {
  313.                     isNotCorrect = true;
  314.                     System.out.println("Некорректно введено одно из значений в файле. Попробуйте заново.");
  315.                 }
  316.             } catch (IOException e) {
  317.                 isNotCorrect = true;
  318.                 System.out.println("Не выходит получить данные из файла. Попробуйте ещё раз.");
  319.             }
  320.             if ((!isNotCorrect) && (isEmpty)) {
  321.                 isNotCorrect = true;
  322.                 System.out.println("Введён пустой файл. Попробуйте ещё раз.");
  323.             }
  324.         } while (isNotCorrect);
  325.         System.out.println("Список получен");
  326.         return list;
  327.     }
  328.  
  329.     public static void saveListToFile(LinkedList list) {
  330.         Node curr = list.head.next;
  331.         int element;
  332.         if (curr != null) {
  333.             System.out.print("Требуется файл для записи ответа. ");
  334.             String path = takePathToFile();
  335.             boolean isNotCorrect;
  336.             do {
  337.                 isNotCorrect = false;
  338.                 try (FileWriter fileWriter = new FileWriter(new File(path))) {
  339.                     while (curr != null) {
  340.                         element = curr.data;
  341.                         fileWriter.write(element + "\n");
  342.                         curr = curr.next;
  343.                     }
  344.                 } catch (IOException ex) {
  345.                     isNotCorrect = true;
  346.                     System.out.print("Произошла ошибка записи в файл. ");
  347.                 }
  348.                 if (isNotCorrect) {
  349.                     System.out.println("Повторите попытку...");
  350.                     path = takePathToFile();
  351.                 }
  352.             } while (isNotCorrect);
  353.             System.out.println("Список сохранён в файл!");
  354.         } else {
  355.             System.out.println("Текущий список пуст!");
  356.         }
  357.     }
  358. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement