Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
3 / 3 / 0
Регистрация: 02.01.2013
Сообщений: 116
1

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

31.01.2013, 01:24. Показов 2635. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть односвязный список
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
struct student
{
    char last_name[10];
    char name[10];
    char date[10];
    int exams[5];
    double rate;
};
 
struct Item
{
    student element;
    Item *next;
};
 
int main()
{
 
    ifstream file1("student.txt");
    char str[200];
    double sum=0;
    int index_exam;
 
    Item *list = new Item;
    Item *list_el = new Item;
    list->next = NULL;
    list_el = list;
        //формирование списка
    while (!file1.eof())
    {
        student comp;
        sum = 0.0;
        file1.getline(str,sizeof(str));
        char *pw;
        pw = strtok(str, " ");
        strcpy(comp.last_name,pw);
 
        pw = strtok(NULL," ");
        strcpy(comp.name,pw);
 
        pw = strtok(NULL," ");
        strcpy(comp.date,pw);
 
        for (index_exam = 0; index_exam<5; index_exam++)
        {
            pw = strtok(NULL," ");
 
            char mark[1];
            strcpy(mark,pw);
            comp.exams[index_exam] = atoi(mark);
            sum+=comp.exams[index_exam];
        }
        comp.rate = sum/5.0;
 
        list_el->next = new Item;
        list_el = list_el->next;
        list_el->element = comp;
        list_el->next = NULL;
 
    }
когда список сформирован мне нужно удалить из него те елементы у которых есть две двойки за екзамены, вот функция удаления:
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
void del_el(Item *list)
{
    Item *p = new Item;
    int dva = 0;
    p = list;
    while (1)
    {
        Item *pps = new Item;
        pps = p;
        
        if (!p) break;
        for (int i=0; i<5; i++)
            if (p->element.exams[i] == 2)
                dva++;
                
        if (dva == 2)
        {
            if (!p->next)
            {
                pps->next = NULL;
                break;
            }
            pps->next = p->next;
            delete p;
            p = pps;
        }
        p = p->next;
        dva = 0;
    }
но тут программа почему то вылетает никак не пойму почему. Отладчиком пользовался, но не смог найти свою ошибку.
Буду благодарен за помощь)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.01.2013, 01:24
Ответы с готовыми решениями:

Удалить элемент из односвязного списка
У нас есть односвязный список и указатель на один из его элементов, как удалить этот элемент из...

Удалить первый элемент односвязного списка
Нужно написать собственный контейнер в виде односвязного списка. Удаление элементов из середины и...

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

Удалить все отрицательные элементы из односвязного списка
Написал код, не работает, не могу найти ошибку, помогите пожалуйста. struct list { int a;...

8
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
31.01.2013, 01:29 2
Сразу же - утечка!!! Сейчас дальше гляну
C++
1
2
3
Item *p = new Item;
    int dva = 0;
    p = list;
Добавлено через 46 секунд
Еще одна:
C++
1
2
        Item *pps = new Item;
        pps = p;
0
3 / 3 / 0
Регистрация: 02.01.2013
Сообщений: 116
31.01.2013, 01:34  [ТС] 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
void insert(Item *list, student comp)
{
    Item *start = new Item;
    Item *tmp = new Item;
    Item *list_el = new Item;
    Item *next_el = new Item;
    start = list->next;
    Item *pp = new Item;
    
 
    while (next_el->next)
    {
        next_el =start->next;
        if (start->element.rate>comp.rate && comp.rate < next_el->element.rate)
        {
            pp = new Item;
            pp->element = comp;
            pp->next = start->next;
            start->next = pp;
        }
        start = start->next;
    }
}
функция не вылетает но работает некоректно. Помогите плз
0
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
31.01.2013, 01:36 4
Pein95, вы в курсе, что под указатели не надо выделять память через new?
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
31.01.2013, 01:37 5
мда...легче все заново написать. Если честно, тут вообще не понятно что и зачем делается.
0
3 / 3 / 0
Регистрация: 02.01.2013
Сообщений: 116
31.01.2013, 03:07  [ТС] 6
Что именно непонятно. Просто никак не пойму как работать с списками. Вот и пишу такой код(

Добавлено через 1 час 20 минут
есть ещо тут кто? просто очень нужно сделать(
0
1824 / 732 / 99
Регистрация: 01.10.2012
Сообщений: 3,746
31.01.2013, 04:08 7
Цитата Сообщение от Pein95 Посмотреть сообщение
Что именно непонятно. Просто никак не пойму как работать с списками. Вот и пишу такой код(
Выкиньте Item и поместите поле next прямо в структуру student. Тогда добавление в список
C++
1
2
3
4
5
student * theList = 0;
..
student * st = new student;
st->next = theList;
theList = st;
0
3 / 3 / 0
Регистрация: 02.01.2013
Сообщений: 116
31.01.2013, 04:45  [ТС] 8
Мне нужно не просто добавить список. а добавить в отсортированный список.
0
1824 / 732 / 99
Регистрация: 01.10.2012
Сообщений: 3,746
31.01.2013, 14:41 9
Цитата Сообщение от Pein95 Посмотреть сообщение
Мне нужно не просто добавить список. а добавить в отсортированный список.
Ну и добавляйте
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
template <class T>
void InsertSorted( T *& head, T * elem )
{
// add to head
 if (!head || (*elem) < (*head)) {
  elem->next = head;
  head = elem;
 } 
 else {
// find place to insert
  T * lst = head;
  while (lst->next) {
   if ((*elem) < (*lst->next)) break;
   lst = lst->next; 
  }  
// insert
  elem->next = lst->next;
  lst->next = elem; 
}
0
31.01.2013, 14:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.01.2013, 14:41
Помогаю со студенческими работами здесь

Добавить элемент в конец односвязного списка
Поправьте, пожалуйста, что не так с функцией Add_end.(остальное работает) #include &lt;iostream&gt;...

Найти максимальный элемент односвязного списка
Писал код по видео. Подскажите как можно найти максимальный элемент и его позицию? Вот код. ...

Как удалить последний и предпоследний узел односвязного списка?
Нужна помощь с удалением последних элементов списка. Вывод работает. Удаление элементов нет...

Найти наименьший элемент односвязного линейного списка
Найти наименьший элемент односвязного линейного списка. Сценарий: обходя список найти минимальное...


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

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