Форум программистов, компьютерный форум CyberForum.ru

Удаление элемента односвязного списка - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
Чернокот
0 / 0 / 0
Регистрация: 23.07.2014
Сообщений: 5
28.07.2014, 17:30     Удаление элемента односвязного списка #1
Здравствуйте. Написал вот такой код. В программе происходит создание списка, вывод его на экран, а так же удаление первого элемента, меньшего заданного числа. Вот как раз с удалением возникла проблема: удаляется любой элемент списка, кроме первого. Когда хочу, чтоб удалился первый элемент, программа вылетает. Прошу помочь решить эту проблему.
P. S. Числа при создании списка добавляются в голову.
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include "stdafx.h"
#include <iostream>
#include <string.h>
#include <conio.h>
using namespace std;
//описание структуры
struct point
{
    int num;//информационное поле
    point*next;//адресное поле
};
point* make_point()
//создание одного элемента
{
 
    point*p=new(point);//выделить память
    cout<<"\nВведите число: ";
    cin>>p->num;
    p->next=0;//сформировать адресное поле
    return p;
}
void print_point(point*p)
//печать информационных полей одного элемента списка
{
    cout<<"\nЧисло: "<<p->num;
}
 
point* make_list(int n)
//формирование списка из n элементов
{
    point* beg=make_point();//сформировать первый элемент
    point*r;
    for(int i=1;i<n;i++)
    {
        r=make_point();//сформировать следующий элемент
        //добавление в начало списка
        r->next=beg;//сформировать адресное поле
        beg=r;//изменить адрес первого элемента списка
    }
    return beg;//вернуть адрес начала списка
}
 
int print_list(point*beg)
//печать списка, на который указывает указатель beg
{
    point*p=beg;//р присвоить адрес первого элемента списка
    int k=0;//счетчик количества напечатанных элементов
    while(p)//пока нет конца списка
    {
        print_point(p);//печать элемента, на который указывает элемент p
        p=p->next;//переход к следующему элементу
        k++;
    }
    return k;//количество элементов в списке
}
 
int find(point*beg)
{
    int isk;
    cout<<"\nвведите значение\n";
    cin>>isk;
    point*p=beg;
    int k=0;
    while(p)
    {
        if(p->num<isk){ break;}
        p=p->next;
        k++;
    }
    return k;
}
 
point*del_point(point*beg,int k)
//удаление элемента с номером к
{
    point*p=beg;//поставить вспомогательную переменную на начало списка
    int i=0;//счетчик элементов в списке
    if(k==0)
    {//удалить первый элемент
        beg=p->next;
        delete[]p;//удалить элемент из списка
        return beg;//вернуть адрес первого элемента списка
    }
        point*r;//вспомогательная переменная для удаления
    while(p)//пока нет конца списка
    {
        if(i==k-1)//дошли до элемента с номером k-1, чтобы поменять его поле next
        {//удалить элемент
            r=p->next;//поставить r на удаляемый элемент
            if(r)//если p не последний элемент
            {
                p->next=r->next;//исключить r из списка
                delete[]r;//удалить элемент из списка
            }
            else p->next=0;//если p -последний элемент, то в поле next присвоить NULL
        }
        p=p->next;//переход к следующему элементу списка
        i++;//увеличить счетчик элементов
    }
    return beg;//вернуть адрес первого элемента
}
 
void main()
{
    setlocale(LC_ALL, "rus");
    int n;
    cout<<"\nВведите размер листа: ";
    cin>>n;
    point*beg=make_list(n);//формирование списка
    if(!print_list(beg)) cout<<"\nЛист пуст";
    int k=find(beg);
    del_point(beg,k);
    cout<<"\nИзменённый список: ";
    print_list(beg);
    getch();//печать списка
}
Добавлено через 1 час 52 минуты
поднимем
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.07.2014, 17:30     Удаление элемента односвязного списка
Посмотрите здесь:

C++ Удаление нескольких элементов из односвязного списка
C++ Удаления элемента из односвязного списка
Удаление значения из односвязного списка C++
Удаление элемента из односвязного списка C++
C++ Удаление первого элемента односвязного списка
Удаление элементов из односвязного списка списка C++
Удаление элемента из односвязного списка, представленного классом C++
Удаление положительных значений из односвязного списка C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,164
Завершенные тесты: 1
28.07.2014, 18:05     Удаление элемента односвязного списка #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
beg надо передать по ссылке
C++
1
void del_point(point* &beg,int k)
Возвращать beg не надо,
т.е. в строках 82 и 100 пишем
C++
1
return;
Чернокот
0 / 0 / 0
Регистрация: 23.07.2014
Сообщений: 5
28.07.2014, 18:13  [ТС]     Удаление элемента односвязного списка #3
Спасибо огромное! Всё работает.
Yandex
Объявления
28.07.2014, 18:13     Удаление элемента односвязного списка
Ответ Создать тему
Опции темы

Текущее время: 12:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru