Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 08.11.2018
Сообщений: 15

Линейный однонаправленный список: удаление элемента перед первым положительным элементом

17.02.2019, 18:42. Показов 2041. Ответов 1

Студворк — интернет-сервис помощи студентам
Есть функции для ввода и вывода списка, освобождения памяти. Проблема с функцией для удаления элемента перед первым положительным элементом. Не подскажите как это исправить в самой функции и при использовании ее в main? Вставлю весь код полностью

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include "pch.h"
#include <iostream>
using namespace std;
struct Node
{
    int data;
    Node *next;
};
void Add_Node (Node *&head, Node *&end, int x)
{
    Node* c = new Node;
    c->next = NULL;
    c->data = x;
    if (head == NULL)
    {
        head = c; end = c;
    }
    else
    {
        end->next = c;
        end = c;
    }
}
void Vivod(Node* head)
{
    cout << "Cписок: " << endl;
    Node* c = head;
    while (c != NULL)
    {
        cout << c->data<<" ";
        c = c->next;
    }
    cout << endl;
}
void Free_Memory(Node* head)
{
    Node* c = head;
    while (c != NULL)
    {
        head = head->next;
        delete c;
        c = head;
    }
}
void Delete(Node* &head, Node* &end, int x)
{
    Node *tmp = head;
    Node *prev = NULL;
    
    if (tmp != NULL && tmp->data == x)
    {
        head = tmp->next;
        delete tmp;
        return;
    }
    while (tmp != NULL && tmp->data != x)
    {
        prev = tmp;
        tmp = tmp->next;
    }
    if (tmp == NULL)
        return;
    prev->next = tmp->next;
    if (tmp == end)
    {
        end = prev;
    }
    delete tmp;
}
int main()
{
    Node* head=NULL;
    Node* end = NULL;
    Node *c=new Node;
    int x, n;
    
    cout << "Сколько чисел хотите ввести?";
    cin >> n;
    cout << "Ввод списка:";
    for (int i = 1; i <= n; i++)
    {
        cin >> x;
        Add_Node(head, end, x);
    }
    Vivod(head);
    if (c->next->data > 0)
    {
        Delete(head, end, x );
        c->next;
    }
    cout << "Список после удаления: ";
    Vivod(head);
    Free_Memory(head);
    system("pause");
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.02.2019, 18:42
Ответы с готовыми решениями:

Однонаправленный связанный список (Вставить новый узел с нулевым значением перед первым отрицательным элементом...)
Помогите выполнить задание: Тип информационной части узла списка - INT Вид списка - Однонаправленный связанный список ...

Вставка нового элемента в линейный односвязный список перед элементом с максимальным значением ключа
Привет, всем. Помогите, разобраться с добавлением нового элемента в линейный односвязный список перед элементом с максимальным значением...

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

1
447 / 333 / 172
Регистрация: 01.07.2015
Сообщений: 1,161
18.02.2019, 07:30
Цитата Сообщение от Tora Посмотреть сообщение
Проблема с функцией для удаления элемента перед первым положительным элементом
Это че-то странное:

C++
1
2
3
4
5
6
7
    Node *c=new Node;
 
    if (c->next->data > 0)
    {
        Delete(head, end, x );
        c->next;
    }
Код должен выглядеть примерно так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <iostream>
using namespace std;
struct Node {
  int data;
  Node* next;
};
void Add_Node(Node*& head, Node*& end, int x) {
  Node* c = new Node;
  c->next = NULL;
  c->data = x;
  if (head == NULL) {
    head = c;
    end = c;
  } else {
    end->next = c;
    end = c;
  }
}
void Vivod(Node* head) {
  cout << "Cписок: " << endl;
  Node* c = head;
  while (c != NULL) {
    cout << c->data << " ";
    c = c->next;
  }
  cout << endl;
}
void Free_Memory(Node* head) {
  Node* c = head;
  while (c != NULL) {
    head = head->next;
    delete c;
    c = head;
  }
}
void Delete(Node*& head, Node*& end, int x) {
  Node* tmp = head;
  Node* prev = NULL;
 
  if (tmp != NULL && tmp->data == x) {
    head = tmp->next;
    delete tmp;
    return;
  }
  while (tmp != NULL && tmp->data != x) {
    prev = tmp;
    tmp = tmp->next;
  }
  if (tmp == NULL)
    return;
  prev->next = tmp->next;
  if (tmp == end) {
    end = prev;
  }
  delete tmp;
}
int main() {
  Node* head = NULL;
  Node* end = NULL;
  int x, n;
 
  cout << "Сколько чисел хотите ввести?";
  cin >> n;
  cout << "Ввод списка:";
  for (int i = 1; i <= n; i++) {
    cin >> x;
    Add_Node(head, end, x);
  }
  Vivod(head);
  Node* c = head;
  while (c) {
    if (c->next->data > 0) {
      Delete(c, end, x);
 
      break;
    }
 
    c = c->next;
  }
  cout << "Список после удаления: ";
  Vivod(head);
  Free_Memory(head);
  system("pause");
  return 0;
}
Вникать в delete лень, но удаляет первый элемент неправильно (x == head->data)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.02.2019, 07:30
Помогаю со студенческими работами здесь

Вставить элемент с данным значением k после перед первым положительным элементом массива
Вставить элемент с данным значением k после перед первым положительным элементом массива

Линейный однонаправленный список. Удаление элементов
Создать линейный однонаправленный список. Удалить из него все символы 'p' перед символом 'a'. Вывести список после ввода символов и после...

Сформировать однонаправленный список и добавить элемент перед элементом с заданным ключом
задача: Сформировать однонаправленный список. Добавить элемент перед элементом с заданным ключом; Наиболее близко к решению...

В массиве А(3,4) обнулить элементы между первым отрицатльным и первым положительным элементом
В массиве А(3,4) обнулить элементы между первым отрицатльным и первым положительным элементом.

Задача на вставку нулевого элемента перед первым минимальным элементом многомерного массива
Задание : Вставить нулевую строку и нулевой столбец перед строкой и столбцом, где находится первый минимальный элемент. Моя наработка : ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru