НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ УКРАЇНИ
“КИЇВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ
імені ІГОРЯ СІКОРСЬКОГО”
ЗВІТ
з лабораторної роботи №5
з навчальної дисципліни “Програмування складних алгоритмів”
Тема:
ЛІНІЙНІ ОДНОЗВ’ЯЗНІ ТА ДВОЗВ’ЯЗНІ СПИСКИ
Варіант 7
Київ 20____
Мета:
Метою лабораторної роботи є ознайомитися з основами роботи з двозв’язним списком, однозв’язним списком, стеком та чергою.
Теоретична частина
Список – це лінійна послідовність елементів, кожен з яких має вказівник на своїх сусідів. Якщо елементи списку не мають вказівників на своїх сусідів, то список називають нелінійним. Кожен елемент списку повинен складатися, як мінімум з двох полів – це інформаційне поле та вказівник на наступний елемент. Інформаційне поле може набувати вигляду змінної будь-якого типу.
Над списками визначено наступні основні операції :
Додавання нового елемента, перед заданим;
видалення заданого елемента;
знаходження елемента за заданими властивостями;
перевірка чи порожній список;
сортування або впорядковування елементів списку за певним критерієм;
визначення розміру списку.
В залежності від типу та кількості зв’язків списки бувають таких видів:
Однонапрямлені:
Лінійний список, в якому кожний елемент має вказівник на наступний, називається однонапрямленим або однозв’язним списком, він є найпростішим типом списків. Одним з недоліків однонапрямленого списку – це те, що по однонапрямленому списку можна рухатися тільки в одному напрямку: від першого до останнього вузла, що при розв’язанні задач може викликати незручності. Так, наприклад, неможливо визначити адресу попереднього елемента.
Двонапрямлені:
Двонапрямленим або двозв’язним списком називається динамічна структура, кожен з елементів якої має вказівник як на наступний, так і на попередній елемент.
У такому списку набагато простіше видаляти та переставляти елементи, так як відомі адреси попереднього та наступного елементів списку.
Циклічні:
Циклічними або кільцевими списками називають двонапрямлені або однонапрямлені списки, в яких вказівник останнього вузла вказує на адресу першого вузла, або навпаки.
Завдання по варіанту
1. Створити лінійний однозв’язний список, вивести його. Якщо в списку є елемент із заданим ключем, вилучити його, а попередній та настуні поміняти місцями. Виконати завдання згідно варіанту.
2. Створити двозв’язний список, вивести його. Якщо в списку є елемент із заданим ключем, вилучити його. Виконати завдання згідно варіанту з двозв’язним списком.
№ Варіанту
Індивідуальне завдання
7
За один перегляд списку i без використання додаткових списку надрукувати елементи списку в наступному порядку: спочатку всi числа, менші за A, потім всi iншi числа. В кожнiй з груп зберегти взаємний порядок.
Результати виконання лабораторної роботи.
/
/
Створена програма працює з одно- та дво- зв’язним списками. Вона виконує поставлені задачі для обох видів списків.
Програмний код
import java.util.*;
public class LR5 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.print("Виберіть список:\n1 - Однозв'язний\n2 - Двозв'язний\nВибір: ");
int choiceOfTask = scan.nextInt();
if(choiceOfTask == 1) {
SinglyLinkedList sList = new SinglyLinkedList();
System.out.print("\nВведіть кількість елементів: ");
int amountOfElem = scan.nextInt();
for (int i = 0; i < amountOfElem; i++) {
sList.addNode((int) (Math.random() * 20 - 10));
}
System.out.println("Однозв'язний список: ");
sList.display();
System.out.println("Завдання 1(1). Якщо в списку є елемент із заданим ключем, вилучити його, а попередній та настуній поміняти місцями");
System.out.print("Введіть число: ");
int value = scan.nextInt();
sList.task1(value);
System.out.println("Результат:");
sList.display();
System.out.println("Завдання 1(2). За один перегляд списку i без використання додаткових списку надрукуватиелементисписку в наступному порядку: спочатку всi числа, меншi за A, потiм числа всi iншi числа.В кожнiй з груп зберегти взаємний порядок.");
System.out.print("Введіть число: ");
value = scan.nextInt();
sList.task12(value);
sList.deleteList();
}
if(choiceOfTask == 2) {
DoublyLinkedList dList = new DoublyLinkedList();
System.out.print("\nВведіть кількість елементів: ");
int amountOfElem = scan.nextInt();
for (int i = 0; i < amountOfElem; i++) {
dList.addNode((int) (Math.random() * 20 - 10));
}
System.out.println("Двозв'язний список:");
dList.display();
System.out.println("Завдання 2(1). Якщо в списку є елемент із заданим ключем, вилучити його, а попередній та настуній поміняти місцями");
System.out.print("Введіть число: ");
int value = scan.nextInt();
dList.task1(value);
System.out.println("Результат:");
dList.display();
System.out.println("Завдання 2(2). За один перегляд списку i без використання додаткових списку надрукуватиелементисписку в наступному порядку: спочатку всi числа, меншi за A, потiм числа всi iншi числа.В кожнiй з груп зберегти взаємний порядок.");
System.out.print("Введіть число: ");
value = scan.nextInt();
dList.task12(value);
dList.deleteList();
}
}
}
class SinglyLinkedList {
class Node{
int data;
Node next;
public Node(int data) {
this.data = data;
this.next = null;
}
}
public Node head = null;
public Node tail = null;
public void addNode(int data) {
Node newNode = new Node(data);
if(head == null) {
head = newNode;
tail = newNode;
}
else {
tail.next = newNode;
tail = newNode;
}
}
public void display() {
Node current = head;
if(head == null) {
System.out.println("List is empty");
return;
}
while(current != null) {
System.out.print(current.data + " ");
current = current.next;
}
System.out.println();
}
public void task1(int value) {
Node current = head;
while(current.next != null){
if(current.data == value){
head = head.next;
}
if (current.next.data == value) {
if(current.next.next != null) {
current.next = current.next.next;
int t = current.data;
current.data = current.next.data;
current.next.data = t;
}
else{
current.next = null;
break;
}
}
current = current.next;
}
}
public void task12(int value) {
Node current = head;
ArrayList<Integer> list = new ArrayList<Integer>();
while(current != null){
if(current.data < value) {
System.out.print(current.data + " ");
current = current.next;
}
else{
list.add(current.data);
current = current.next;
}
}
for (int i = 0; i < list.size(); i++)
System.out.print(list.get(i)+" ");
}
void deleteList() {
head = null;
}
}
class DoublyLinkedList {
class Node{
int data;
Node previous;
Node next;
public Node(int data) {
this.data = data;
}
}
Node head, tail = null;
public void addNode(int data) {
Node newNode = new Node(data);
if(head == null) {
head = tail = newNode;
head.previous = null;
tail.next = null;
}
else {
tail.next = newNode;
newNode.previous = tail;
tail = newNode;
tail.next = null;
}
}
public void display() {
Node current = head;
if(head == null) {
System.out.println("Doubly linked list is empty");
return;
}
while(current != null) {
System.out.print(current.data + " ");
current = current.next;
}
System.out.println();
}
public void task1(int value) {
DoublyLinkedList.Node current = head;
while(current != null) {
if (current.data == value) {
if(current != head) {
int temp = current.previous.data;
current.previous.data = current.next.data;
current.next.data = temp;
current.previous.next = current.next;
}
else{
head = head.next;
}
}
current = current.next;
}
}
public void task12(int value) {
DoublyLinkedList.Node current = head;
ArrayList<Integer> list = new ArrayList<Integer>();
while(current != null){
if(current.data < value) {
System.out.print(current.data + " ");
current = current.next;
}
else{
list.add(current.data);
current = current.next;
}
}
for (int i = 0; i < list.size(); i++)
System.out.print(list.get(i)+" ");
}
void deleteList() {
head = null;
}
}
Висновки.
При виконанні лабораторної роботи ознайомився з роботою списків. Для кожного списку створено методи для додавання нових елементів, для очищення списку та для реалізацію завдання.