|
ргз по информатике. односвязный список. Найти первый элемент списка, который содержит положительное значение, вернуть адрес элемента
Задания
Найти первый элемент списка, который содержит положительное значение, вернуть адрес элемента. Оставить в списке только последние вхождения одинаковых элементов, вернуть количество удаленных.
Тестовые данные:
Ввод:-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();
}
| Графическое представление Односвязного списка
|
|
|