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

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

Войти
Регистрация
Восстановить пароль
 
Pein95
3 / 3 / 0
Регистрация: 02.01.2013
Сообщений: 116
#1

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

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

Есть односвязный список
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;
    }
но тут программа почему то вылетает никак не пойму почему. Отладчиком пользовался, но не смог найти свою ошибку.
Буду благодарен за помощь)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
12878 / 7264 / 810
Регистрация: 27.09.2012
Сообщений: 17,950
Записей в блоге: 2
Завершенные тесты: 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;
Pein95
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;
    }
}
функция не вылетает но работает некоректно. Помогите плз
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
31.01.2013, 01:36     Удалить элемент из односвязного списка #4
Pein95, вы в курсе, что под указатели не надо выделять память через new?
Croessmah
Модератор
Эксперт CЭксперт С++
12878 / 7264 / 810
Регистрация: 27.09.2012
Сообщений: 17,950
Записей в блоге: 2
Завершенные тесты: 1
31.01.2013, 01:37     Удалить элемент из односвязного списка #5
мда...легче все заново написать. Если честно, тут вообще не понятно что и зачем делается.
Pein95
3 / 3 / 0
Регистрация: 02.01.2013
Сообщений: 116
31.01.2013, 03:07  [ТС]     Удалить элемент из односвязного списка #6
Что именно непонятно. Просто никак не пойму как работать с списками. Вот и пишу такой код(

Добавлено через 1 час 20 минут
есть ещо тут кто? просто очень нужно сделать(
Igor3D
903 / 458 / 40
Регистрация: 01.10.2012
Сообщений: 2,286
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;
Pein95
3 / 3 / 0
Регистрация: 02.01.2013
Сообщений: 116
31.01.2013, 04:45  [ТС]     Удалить элемент из односвязного списка #8
Мне нужно не просто добавить список. а добавить в отсортированный список.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.01.2013, 14:41     Удалить элемент из односвязного списка
Еще ссылки по теме:

C++ Добавить элемент в конец односвязного списка
C++ Удалить из односвязного линейного списка определенный узел
C++ Задача Иосифа Флавия. Удалить каждый второй элемент из списка и в конце вывести на экран последний оставшийся элемент
C++ Как удалить нужный элемент из списка или заменить этот элемент на другой?
Создание и вывод односвязного списка (выводится только первый элемент) C++

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

Или воспользуйтесь поиском по форуму:
Igor3D
903 / 458 / 40
Регистрация: 01.10.2012
Сообщений: 2,286
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; 
}
Yandex
Объявления
31.01.2013, 14:41     Удалить элемент из односвязного списка
Ответ Создать тему
Опции темы

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