Главная страница

ргз по информатике. односвязный список. Найти первый элемент списка, который содержит положительное значение, вернуть адрес элемента


Скачать 34.02 Kb.
НазваниеНайти первый элемент списка, который содержит положительное значение, вернуть адрес элемента
Анкорргз по информатике
Дата09.06.2022
Размер34.02 Kb.
Формат файлаdocx
Имя файлаодносвязный список.docx
ТипДокументы
#581126

Задания

  • Найти первый элемент списка, который содержит положительное значение, вернуть адрес элемента.

  • Оставить в списке только последние вхождения одинаковых элементов, вернуть количество удаленных.

Тестовые данные:

Ввод:-1 -2 -3 -4 -5 -6 -7 1 2 3 4 5 6 7

Вывод: адрес положительного элемента: 0095E118

После удаления:-1 -2 -3 -4 -5 -6 -7 1 2 3 4 5 6 7

Ввод:1 2 3 4 5 6 7 1 2 3 4 5 6 7

Вывод: адрес положительного элемента: 00F3E188

После удаления: 1 2 3 4 5 6 7

Ввод:1 2 3 1 2 3 1 2 3 4

Вывод: адрес положительного элемента: 00B4E330

После удаления:1 2 3 4

List.h

#pragma once

//Функции для работы с односвязным списком

#define N 6

struct List // Создание нового типа данных

{

int value; // информационная часть

List* next; // служебная часть

List(int val = 0, List* p = NULL) // конструктор

{

value = val;

next = p;

}

};
// Включение элемента в начало списка

List* Insert_first(int n, List* head)

{

List* q = new List(n, head);

return q;

}
// Включение элемента в конец списка

List* Add_last(int n, List* head)

{

List* q = new List(n), * p = head;

if (head == NULL) return q;

while (p->next != NULL)

p = p->next;

p->next = q;

return head;

}
// Включение элемента в упорядоченный список

List* Insert_Sort(int n, List* head)

{

List* q = new List(n), * p = head;
if (head == NULL) return q;
if (n < head->value) // Включение элемента в начало списка

{

q->next = head;

return q;

}
while (p->next != NULL)

if (n < p->next->value) // Включение элемента в середину списка

{

q->next = p->next;

p->next = q;

break;

}

else

p = p->next;

p->next = q; // Включение элемента в конец списка

return head;

}
// Включение элемента в список по номеру

List* Insert_Number(int Num, int n, List* head)

{

List* p = head, * q = new List(n);

int i = 1;

if (head == NULL) return q;

if (Num == 1) // Включение элемента в начало списка

{

q->next = head;

return q;

}

while (p->next != NULL)

if (Num == i + 1) // Включение элемента в середину списка

{

q->next = p->next;

p->next = q;

return head;

}

else

{

i++;

p = p->next;

}

if (Num == i + 1) // Включение элемента в конец списка

p->next = q;

else

puts("Такого номера в списке нет!");

return head;

}
// Создание списка (добавляя элементы в начало)

List* Creat_list()

{

char str[N];

List* head = NULL;

puts("Создание списка. Вводите числа:");

for (;;)

{

gets_s(str);

if (!str[0]) break;

head = Insert_first(atoi(str), head); // вызов функции "Включение элемента в начало списка"

}

return head;

}
// Удаление элемента из начала списка

List* Delete_first(int& n, List* head)

{

List* p = head;

if (p == NULL)puts("Список пуст!");

else

{

n = p->value;

head = head->next;

delete p;

}

return head;

}
// Удаление элемента из конца списка

List* Delete_last(int& n, List* head)

{

List* p = head;

if (p == NULL) { puts("Список пуст!"); return NULL; }

if (head->next == NULL) // один элемент в списке

{

n = head->value;

delete head;

return NULL;

}

while (p->next->next != NULL)

p = p->next;

n = p->next->value;

delete p->next;

p->next = NULL;

return head;

}

List* del_node(List* n)

{

List* nn;

if (!n)

return NULL;

nn = n->next;

free(n);

return nn;

}

// Удаление элемента из списка по значению

void remove_duplicates(List* n)

{

List* p;
while (n && n->next) {

for (p = n; p && p->next; p = p->next)

while ((p->next->value == n->value) && (p->next = del_node(p->next)))

;

n = n->next;

}

}

// Удаление элемента из списка по номеру

List* Delete_Number(int Num, List* head)

{

List* p = head, * t;

int i = 1;

if (head == NULL) { puts("Список пуст!"); return NULL; }

if (Num == 1) // Удаление элемента из начала списка

{

t = head;

head = head->next;

delete t;

return head;

}

while (p->next != NULL)

if (Num == i + 1) // Удаление элемента из середины списка

{

t = p->next;

p->next = p->next->next;

delete t;

return head;

}

else

{

i++;

p = p->next;

}

puts("Такого номера в списке нет!"); // Такого номера в списке нет

return head;

}
// Печать содержимого списка

void Print_list(List* head)

{

List* p = head;

puts("\n PRINT LIST");

if (p == NULL) puts("Список пуст!");

else

while (p != NULL)

{

printf("%d ", p->value);

p = p->next;

}

}

//Поиск первого вхождения положительного числа

List* Sort_list(List* head)

{

List* p = head;

int i = 0;

if (p == NULL) puts("Список пуст!");//проверка на заполненость списка

while (p != NULL)

{

if (p->value >0)//проверка на положительность числа

{

i = i + 1;

printf("адрес элемента");//вывод адреса эллемента

return head;

}

else i = i + 1;

p = p->next;

}

}

Односвязный список.cpp

#define _CRT_SECURE_NO_WARNINGS

#include

#include

#include

#include

#include

#include "list.h"

void Menu()

{

int i, k, n, num;

char c;

const char* ss[] = { " 0 - Печать списка", " 1 - адрес положительного элемента", " 2 - Включение в начало", \

" 3 - Добавление в конец", " 4 - Включение по номеру", " 5 - Удаление из начала", " 6 - Удаление из конца",\

" 7 -Удаление по значению", " 8 - Удаление по номеру", " 9 - ВЫХОД" };

k = sizeof(ss) / sizeof(ss[0]);
List* head = NULL;

for (;;)

{

puts("\n--------------------РАБОТА С ОДНОСВЯЗНЫМ СПИСКОМ ----------------");

for (i = 0; i < k; i++) puts(ss[i]); // Вывод меню

c = _getch(); // выбор действия со списком

switch (c)

{

case '0': Print_list(head); break;

case '1': head = Sort_list(head); printf("%p", head); break;

case '2': printf("число: "); scanf("%d", &num); head = Insert_first(num, head); break;

case '3': printf("число: "); scanf("%d", &num); head = Add_last(num, head); break;

case '4': printf("номер: "); scanf("%d", &num); printf("число: "); scanf("%d", &n);

head = Insert_Number(num, n, head); break;

case '5': head = Delete_first(num, head); break;

case '6': head = Delete_last(num, head); break;

case '7': remove_duplicates(head); break;

case '8': printf("номер: "); scanf("%d", &num); head = Delete_Number(num, head); break;

case '9': return;

}

}
}

int main()

{

SetConsoleCP(1251);

SetConsoleOutputCP(1251);

system("color 04");

Menu();

}

Графическое представление Односвязного списка



написать администратору сайта