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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
DigsiL
10 / 10 / 1
Регистрация: 14.01.2011
Сообщений: 113
#1

Односвязный список (задача) - C++

30.08.2011, 09:24. Просмотров 1087. Ответов 9
Метки нет (Все метки)

Задача в следующем есть код нужна переправить его таким образом чтобы программа удаляла заданный символ.
Сейчас программа удаляет 3 первых символа.


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
117
118
119
120
121
122
123
124
#include <iostream>
using namespace std;
 
struct Element
{
    // Данные
    char data;
    // Адрес следующего элемента списка
    Element * Next;
};
 
class List
{
    // Адрес головного элемента списка
    Element * Head;
    // Адрес головного элемента списка
    Element * Tail;
    // Количество элементов списка
    int Count;
 
public:
    List()
    {
        // Изначально список пуст
        Head = Tail = NULL;   
        Count = 0;
    }
 
    // Добавление элемента в список  (Новый элемент становится последним)
    void Add(char data)
    {
        // создание нового элемента
        Element * temp = new Element;
 
        // заполнение данными
        temp->data = data;
        // следующий элемент отсутствует
        temp->Next = NULL;
        // новый элемент становится последним элементом списка если он не первый добавленный
        if(Head!=NULL)
        {
            Tail->Next=temp;
            Tail = temp;
        }
        // новый элемент становится единственным
        // если он первый добавленный
        else{
            Head=Tail=temp;
        }
    }
 
    // Удаление элемента списка (Удаляется головной элемент)
    void Del()
    {
        // запоминаем адрес головного элемента
        Element * temp = Head;
        // перебрасываем голову на следующий элемент
        Head = Head->Next;
        // удаляем бывший головной элемент
        delete temp;
    }
    // Удаление всего списка
    void DelAll()
    {
        // Пока еще есть элементы
        while(Head != 0)
            // Удаляем элементы по одному
            Del();
    }
 
    void Print()
    {
        // запоминаем адрес головного элемента
        Element * temp = Head;
        // Пока еще есть элементы
        while(temp != 0)
        {
            // Выводим данные
            cout << temp->data;
            // Переходим на следующий элемент
            temp = temp->Next;
        }
 
        cout <<endl;
    }
 
    int GetCount()
    {
        // Возвращаем количество элементов
        return Count;
    }
 
    ~List()
    {
        DelAll();
    }
};
 
 
 
void main()
{
    List lst;
 
    char s[] = "Hello, World !!!";
 
    cout << s <<endl;
 
    // Определяем длину строки
    int len = strlen(s);
 
    // Загоняем строку в список
    for(int i = 0; i < len; i++)
        lst.Add(s[i]);
 
    lst.Print();
 
    // Удаляем три элемента списка
    lst.Del();
    lst.Del();
    lst.Del();
 
    lst.Print();
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.08.2011, 09:24
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Односвязный список (задача) (C++):

Сформировать список из 10 книг, используя динамическую структуру данных односвязный список - C++
друзья спасайте Сформировать список из 10 книг, используя динамическую структуру данных односвязный список С++

Создать двусвязный список групп факультета, где каждая группа представляет собой односвязный список студентов - C++
Задание: создайте двусвязный список групп факультета. Каждая группа представляет собой односвязный список студентов. Помогите пожалуйста,...

Задали односвязный линейный список с целыми числами. Создать новый список, который содержит элементы заданного списка в обратном порядке - C++
Задали односвязный линейный список с целыми числами. Создать новый список, который содержит элементы заданного списка в обратном порядке.

Односвязный Список - C++
Как реализовать список в этом коде, необязательно писать код буду благодарен за совет или подсказку! #include &quot;stdafx.h&quot; #include...

Односвязный список - C++
Доброго времени суток. Помогите, пожалуйста, решить задачу: Реализовать односвязный список, с возможностью его разворота в обратную...

Односвязный список - C++
как в односвязном списке сделать проверку на одинаковые элементы? и если они есть, удалить один из них.

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Mee
14 / 14 / 1
Регистрация: 05.07.2010
Сообщений: 88
30.08.2011, 10:17 #2
Нужно изменить функцию Del
Идем до предпоследнего элемента, удаляем последний, обнуляем указатель, вроде должно работать
C++
1
2
3
4
5
6
7
8
9
        void Del()
        {
                // запоминаем адрес головного элемента
                Element * temp = Head;
               while (temp -> Next -> Next != 0)
                       temp = temp -> Next; 
                delete temp -> Next;
                temp -> Next = 0;
        }
вроде бы так
0
Aneron
158 / 157 / 12
Регистрация: 20.04.2010
Сообщений: 570
30.08.2011, 10:25 #3
как то так
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
//Удалить заданный элемент.
void Del(int id)
{
int i = 0;
Element * temp = Head;
Element * prev_temp;
 
if( i == 0 )
{
temp = Head;
Head = Head->Next;
}
else
{
while(i != id)
{
prev_temp = temp;
temp = temp ->Next;
++i;
}
}
prev_temp->Next = temp->Next;
delete temp;
}
1
DigsiL
10 / 10 / 1
Регистрация: 14.01.2011
Сообщений: 113
30.08.2011, 10:25  [ТС] #4
Цитата Сообщение от Mee Посмотреть сообщение
Нужно изменить функцию Del
Идем до предпоследнего элемента, удаляем последний, обнуляем указатель, вроде должно работать
C++
1
2
3
4
5
6
7
8
9
        void Del()
        {
                // запоминаем адрес головного элемента
                Element * temp = Head;
               while (temp -> Next -> Next != 0)
                       temp = temp -> Next; 
                delete temp -> Next;
                temp -> Next = 0;
        }
вроде бы так
Меня интересует удаление заданного символа со старки а не 3 последних
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
30.08.2011, 10:26 #5
Mee, надо удалить заданный символ, а не последний.

DigsiL, добавьте в класс такой метод:
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
void Del(char c)
{
    Element *i, *j;
 
    if (Head->data == c)
    {
        Del();
 
        return;
    }
 
    if (Head != Tail)
    {
        i = Head;
        j = Head->Next;
 
        while (j->data != c)
        {
            if (j->Next == 0)
                return;
 
            i = i->Next;
            j = j->Next;
        }
 
        i->Next = j->Next;
 
        if (Tail == j)
            Tail = i;
 
        delete j;
    }
}
1
DigsiL
10 / 10 / 1
Регистрация: 14.01.2011
Сообщений: 113
30.08.2011, 10:31  [ТС] #6
Цитата Сообщение от Aneron Посмотреть сообщение
как то так
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
//Удалить заданный элемент.
void Del(int id)
{
int i = 0;
Element * temp = Head;
Element * prev_temp;
 
if( i == 0 )
{
temp = Head;
Head = Head->Next;
}
else
{
while(i != id)
{
prev_temp = temp;
temp = temp ->Next;
++i;
}
}
prev_temp->Next = temp->Next;
delete temp;
}
Ошибка гдето (
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
30.08.2011, 10:35 #7
Aneron, ваш код удаляет узел с заданным индексом. Требовалось же удалить заданный символ.
1
DigsiL
10 / 10 / 1
Регистрация: 14.01.2011
Сообщений: 113
30.08.2011, 10:37  [ТС] #8
Цитата Сообщение от silent_1991 Посмотреть сообщение
Mee, надо удалить заданный символ, а не последний.

DigsiL, добавьте в класс такой метод:
C++
1
2
3
4
5
6
    if (Head->data == c)
    {
        Del();
 
        return;
    }
Не пойму а для чего этот блок кода ?
0
Aneron
158 / 157 / 12
Регистрация: 20.04.2010
Сообщений: 570
30.08.2011, 10:37 #9
Цитата Сообщение от silent_1991 Посмотреть сообщение
Aneron, ваш код удаляет узел с заданным индексом. Требовалось же удалить заданный символ.
не спорю. но его легко модифицировать для решения поставленной задачи.
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
30.08.2011, 10:40 #10
Цитата Сообщение от Aneron Посмотреть сообщение
но его легко модифицировать для решения поставленной задачи
На отмазку не тянет

Цитата Сообщение от DigsiL Посмотреть сообщение
для чего этот блок кода ?
Остальной код не предназначен для удаления первого элемента (когда указанный символ находится в начале списка), поэтому этот случай обрабатывается отдельно.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.08.2011, 10:40
Привет! Вот еще темы с ответами:

Односвязный список - C++
Дан список целых чисел , удалить все положительные. struct my_list{ int num; struct my_list*Next; } int x; my_list...

Односвязный список - C++
Задание: Сформировать список вещественных чисел и вычислить сумму. На 32 строке где значения, выдает ошибку. Почему? Сумму этих...

Односвязный список - C++
Доброй ночи! Вроде все написала правильно, прога должна читать из файла KR8+.txt и записывать один элемент в KR8.txt в конец списка... но...

Односвязный список - C++
&quot;Односвязный список 2.exe&quot; (Win32). Загружено &quot;C:\Users\Владислав\Documents\Visual Studio 2012\Projects\Односвязный список...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
30.08.2011, 10:40
Ответ Создать тему
Опции темы

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