4 / 4 / 1
Регистрация: 25.03.2015
Сообщений: 63
1

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

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

Author24 — интернет-сервис помощи студентам
Создать линейный однонаправленный список. Удалить из него все символы '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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.09.2015, 20:22
Ответы с готовыми решениями:

Линейный однонаправленный список: удаление элемента перед первым положительным элементом
Есть функции для ввода и вывода списка, освобождения памяти. Проблема с функцией для удаления...

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

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

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

4
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
28.09.2015, 20:49 2
25 и 29 строчки ничего не делают, на что компилятор должен был матюкнуться. 32 строчка делает undefined behavior, так как обращается к p_list стертому в 30 строчке. Ну и по условию нужен однонаправленный список (без prev), а у вас двунаправленный. Короче, это надо не исправлять, а переписывать с нуля.
1
4 / 4 / 1
Регистрация: 25.03.2015
Сообщений: 63
28.09.2015, 20:59  [ТС] 3
А если список будет циклическим(кольцевым) то каким образом я должен буду проходить символы 'p' перед 'a'?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
28.09.2015, 21:03 4
Если список будет циклическим, то нужно впихнуть в него дополнительный элемент-заголовок с item=0. А дальше - как в не циклическом, только без отработки ситуаций с NULL (их в кольце не бывает) и пустым списком (в списке всегда есть как минимум элемент-заголовок).
0
838 / 641 / 940
Регистрация: 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.09.2015, 12:26
Помогаю со студенческими работами здесь

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

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru