Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
L1oN
2 / 2 / 1
Регистрация: 25.03.2015
Сообщений: 63
1

Линейный однонаправленный список. Удаление элементов

28.09.2015, 20:22. Просмотров 515. Ответов 4
Метки нет (Все метки)

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

Программа совершенно не работает, не знаю в чём проблема и как исправить.

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
#include <iostream>
using namespace std;
 
struct list
{  char item;  
   list *next; // Указатель на следующий элемент
   list *prev; // Указатель на предыдущий элемент
}; 
void show (list *start)  // Функция вывода
{   list *p_list; 
    p_list = start->next;
    while (p_list != NULL)
    {   cout << p_list->item ; 
        p_list = p_list->next;  }}
 
void deleter (list *start)  //Функція вставки символа  s після o
{ 
    char z='p'; 
    char n='a';
        list *p_list;
        p_list = start->next;
            while (p_list->next != NULL)
            {
                if (p_list->item == z) 
                p_list->next;
                if(p_list->item == n)
                    do
                    {
                    p_list->prev;
                    delete p_list;
                    }
                    while(p_list->item == z);
            }
         
            if (p_list->item==n && p_list->next==NULL) // Если символ 'а' последний
            {
                do
                {
                p_list->prev;
                delete p_list;
                }
                while(p_list->item == z);
            }
}
 
 
 
int main()
{  
    list *start = new list;
    start->next = NULL; 
    list *p_list = start;    //  Указатель на первый элемент
    for (int i=1; i<=10; i++) // Вводим необходимое количество символов
    {
    char k; cin>>k; // Вводим символы
    list *tmp = new list;
        tmp->item = k;
        tmp->next = NULL;
        p_list->next = tmp;
        p_list = p_list->next; 
    }
  
 
    show (start); // Выводим список перед обработкой функцией
    deleter(start); // Вызов функции
 
    cout << "=========\n";
 
    show (start); // Выводим список после обработки функцией
 
    cout << "================\n";
 
    return 0; 
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.09.2015, 20:22
Ответы с готовыми решениями:

Линейный однонаправленный список. Описать процедуру добавления одного или нескольких элементов
Читая целые числа из текстового файла, создать линейный односвязный список....

Линейный однонаправленный список
ПОМОГИТЕ СДЕЛАТЬ ПОЖАЛУЙСТА Читая целые числа из текстового файла, создать...

Линейный однонаправленный список
Добрый вечер! Задача: L – линейный однонаправленный список Проверить,...

Линейный однонаправленный список
всем доброго времени не получается создать функцию слияния двух списков методом...

Линейный однонаправленный список
Есть программа, которая инициализирует, заполняет и удаляет список. При...

4
Renji
2123 / 1561 / 476
Регистрация: 05.06.2014
Сообщений: 4,518
28.09.2015, 20:49 2
25 и 29 строчки ничего не делают, на что компилятор должен был матюкнуться. 32 строчка делает undefined behavior, так как обращается к p_list стертому в 30 строчке. Ну и по условию нужен однонаправленный список (без prev), а у вас двунаправленный. Короче, это надо не исправлять, а переписывать с нуля.
1
L1oN
2 / 2 / 1
Регистрация: 25.03.2015
Сообщений: 63
28.09.2015, 20:59  [ТС] 3
А если список будет циклическим(кольцевым) то каким образом я должен буду проходить символы 'p' перед 'a'?
0
Renji
2123 / 1561 / 476
Регистрация: 05.06.2014
Сообщений: 4,518
28.09.2015, 21:03 4
Если список будет циклическим, то нужно впихнуть в него дополнительный элемент-заголовок с item=0. А дальше - как в не циклическом, только без отработки ситуаций с NULL (их в кольце не бывает) и пустым списком (в списке всегда есть как минимум элемент-заголовок).
0
Геомеханик
792 / 597 / 939
Регистрация: 26.06.2015
Сообщений: 1,409
29.09.2015, 12:26 5
Вот набросал.
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
#include <iostream>
 
struct slist {
    char   ch;
    slist* next;
};
 
void slist_copy(slist*& lst, const char* str);
void slist_println(std::ostream& _out, const slist* p);
void slist_clear(slist* lst);
 
//удаление символа-fch перед символом-lch
void slist_remove(slist*& lst, char fch, char lch){
    slist* p, *a, *t, **rv = &lst;
 
    for(p = lst; (p != NULL) && (p->next != NULL); ){
 
        if(p->ch == fch){
            while((p != NULL) && (p->ch == fch))
                p = p->next;
        
            if((p != NULL) && (p->ch == lch)){
                a = *rv;
                if(p == lst)
                    *rv = lst = lst->next;
                else
                    *rv = p;
 
                while(a != p){
                    t = a;
                    a = a->next;
                    delete t;
                }
                continue;
            } else if(p == NULL)
                break;
        }
        rv = &p->next;
        p  = p->next;
    }
}
 
 
int main(void){
    slist* lst = NULL;
 
    char s[] = "pa (pppa) [papp] <ppppapppppa> ppppppppppppaapa";
    slist_copy(lst, s);
 
    slist_println(std::cout, lst);
    slist_remove(lst, 'p', 'a');
    slist_println(std::cout, lst);
 
    slist_clear(lst);
    return 0;
}
 
//копирование строки в список
void slist_copy(slist*& lst, const char* str){
    slist* p, *tail = NULL;
    for(lst = NULL; *str; ++str){
        p = new (std::nothrow)slist();
        if(p == NULL)
            break;
 
        p->ch   = *str;
        p->next = NULL;
 
        if(lst == NULL)
            lst = tail = p;
        else {
            tail->next = p;
            tail = p;
        }
    }
}
 
//печать
void slist_println(std::ostream& _out, const slist* p){
    for(; p != NULL; p = p->next)
        _out << p->ch;
    _out << std::endl;
}
 
//удаление всех
void slist_clear(slist* lst){
    slist* tmp;
    while(lst != NULL){
        tmp = lst;
        lst = lst->next;
        delete tmp;
    }
}
Пример работы кода
0
29.09.2015, 12:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.09.2015, 12:26

Однонаправленный линейный список
здравствуйте! помогите помочь написать задача или киньте ссылку по её решению....

Линейный циклический однонаправленный список
Задание организовать очередь с приоритетом (у каждого элемента свой приоритет)....

Линейный однонаправленный список; ошибка сегментации
Инициализируется всего одна структура данных, затем система пишет: &quot;Ошибка...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru