Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
1 / 1 / 1
Регистрация: 02.02.2014
Сообщений: 109

Редактирование и удаление из списка

27.11.2014, 08:31. Показов 3473. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Код не корректно работает функция (удаления и редактирования) удаляется не тот элемент из списка который надо, а после редактирования из файла не выводится первый элемент... подправьте пожалуйста....
структура:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
struct  Dogovor
{
 int Dogovor_id;
 int klient_id  ;
 int uslugi_id   ;
 
};
 
struct List_Dogovor
{
Dogovor dogovor ;
List_Dogovor*next;
};
удаление
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
void Delete ( )
 
{
    int E;
    cout<<"vvedite ID_Dogovora dlia udalenia ";
    cin>>E;
 
    Sviaz_dogovor(E);
 
    List_Dogovor *temp = head_d;
 
    while(temp!=NULL) // пока не конец списка
    {
        if(temp->dogovor.Dogovor_id==E)//если информационное поле равно Е
        {
            if(temp->next!=NULL) // если это не последний
                //элемент
            {
                List_Dogovor*node=temp->next; // сохранить
                //адрес следующего элемента
                /* записать адрес следующего за удаляемым элементом */
                temp->next=temp->next->next;
                delete node; // освободить память
            }
        }
        temp=temp->next; // перейти к следующему элементу
    }
};
редактирование
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
void Redaktirovanie_dogovor()
{
    int id;
    cout<< "vvedite id dlia redaktirovania: ";
    cin>>id;    
    List_Dogovor* tmp = head_d;
    while(tmp)
    {
        if(tmp->dogovor.Dogovor_id== id)
        {
            List_Dogovor*k=tmp; // делаем что надо.
            Dogovor s; 
            char c;
            cout<<endl<< "Enter Dogovor\n";
            cout <<"vvedite id dogovora (ot 3001) ";
            cin>>s.Dogovor_id;
            proverka_id_dogovor(s.Dogovor_id);
            cin.get(c);
            cout<<"vvedite id klienta (ot 2001-2999) ";
            cin>>s.klient_id;
            cin.get(c);
            cout<<"vvedite id uslugi: ADSl-100,Kommutir internet-101,Pochta-102 ";
            cin>>s.uslugi_id;
            cin.get(c);
 
 
 
            k->dogovor= s;
            k->next = tmp->next;
            
            print_dogovor();
            File_dogovor();
            return;
        }
        else
            tmp = tmp->next;
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.11.2014, 08:31
Ответы с готовыми решениями:

1 Отсортировать по возрастанию (методом выбора). 2 добавление, удаление, редактирование элемента списка (на С без плюсов).
Здравствуйте! Помогите пожалуйста с 2 заданиями на С (без плюсов). Первое пробовал делать, но дальше ввода массива не доходило, если ещё...

Написать код программы, выполняющей растяжку списка и вставку, удаление из списка и сжатие списка
Люди ПОМОГИТЕ осталось совсем мало , мне нужна помощь!!! написать код программ: 1) Написать код программы, выполняющей растяжку...

Поиск списка Х в списке У и редактирование списка Х в зависимости от результата
Привет. Есть 2 списка, в одном хранятся пользовательские данные, а в другом длинный список номеров телефонов и название провайдера. В...

12
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
27.11.2014, 11:02
удаление: вы удаляете следующий элемент, а не текущий
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
void Delete ( ) {
    int E;
    cout<<"vvedite ID_Dogovora dlia udalenia ";
    cin>>E;
 
    Sviaz_dogovor(E);
 
    List_Dogovor *temp = head_d, *prev = NULL, *curr;
 
    while(temp != NULL) // пока не конец списка
    {
        if(temp->dogovor.Dogovor_id==E)//если информационное поле равно Е
        {
            if(prev == NULL) {
                head_d = temp->next;
                delete temp;
                temp = head_d;
            }
            else {
                prev->next = temp->next;
                delete temp;
                temp = prev->next;
            }
            // break;
            
        }
        else {
            prev = temp;
            temp=temp->next; // перейти к следующему элементу
        }
    }
}
редактирование:
Цитата Сообщение от Valera1984 Посмотреть сообщение
k->next = tmp->next;
в этой строке нет смысла, тк k и tmp указывают на одно и тоже место в памяти
Это все равно что записать
C++
1
tmp->next = tmp->next;
0
1 / 1 / 1
Регистрация: 02.02.2014
Сообщений: 109
27.11.2014, 11:34  [ТС]
Cra3y,
Записал вот так
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
void Redaktirovanie_dogovor()
{
    int id;
    cout<< "vvedite id dlia redaktirovania: ";
    cin>>id;    
    List_Dogovor* tmp = head_d;
    while(tmp)
    {
        if(tmp->dogovor.Dogovor_id== id)
        {
            List_Dogovor*k=tmp; // делаем что надо.
            Dogovor s; 
            char c;
            cout<<endl<< "Enter Dogovor\n";
            cout <<"vvedite id dogovora (ot 3001) ";
            cin>>s.Dogovor_id;
            proverka_id_dogovor(s.Dogovor_id);
            cin.get(c);
            cout<<"vvedite id klienta (ot 2001-2999) ";
            cin>>s.klient_id;
            cin.get(c);
            cout<<"vvedite id uslugi: ADSl-100,Kommutir internet-101,Pochta-102 ";
            cin>>s.uslugi_id;
            cin.get(c);
 
 
            
            //
 
            //*tmp=*k;
            k->dogovor=s;
            print_dogovor();
            File_dogovor();
            return;
        }
        else
            tmp = tmp->next;
    }
}
выводит все правильно записывает в файл правильно, а при повторном выводе не выводит одну верхнею строку из файла не знаю почему
вот файл в нем еще в конце отктуда то нули дописались....
C++
1
2
3
4
5
6
7
8
9
10
11
 3004 2004  100
 
 3003 2003  102
 
 5555    5    5
 
 3001 2001  101
 
 3000 2000  100
 
00
вот что выводит на экран
C++
1
2
3
4
5
6
7
 3001 2001  101
 
 3000 2000  100
 
 3003 2003  102
 
 5555    5    5
Без функции редактирования все было нормально...

Добавлено через 1 минуту
Cra3y, По удалению я разобрался Спасибо... Вы описали двусвязный список, а у меня односвязный...
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
27.11.2014, 11:34
Valera1984, функции чтения и записи в файл покажите(а лучше сразу весь код)
0
1 / 1 / 1
Регистрация: 02.02.2014
Сообщений: 109
27.11.2014, 11:35  [ТС]
Cra3y, Подскажи что не так с редактированием....?
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
27.11.2014, 11:35
Цитата Сообщение от Valera1984 Посмотреть сообщение
. Вы описали двусвязный список, а у меня односвязный...
нет, я просто сохранял предидущий элемент
0
1 / 1 / 1
Регистрация: 02.02.2014
Сообщений: 109
27.11.2014, 11:55  [ТС]
Cra3y,

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
void insert_dogovor  () //добавление
   {
   Dogovor s;
   char c;
   cout<<endl<< "Enter Dogovor\n";
   cout <<"vvedite id dogovora (ot 3001) ";
   cin>>s.Dogovor_id;
   proverka_id_dogovor(s.Dogovor_id);
   cin.get(c);
   cout<<"vvedite id klienta (ot 2001-2999) ";
   cin>>s.klient_id;
   cin.get(c);
   cout<<"vvedite id uslugi: ADSl-100,Kommutir internet-101,Pochta-102 ";
   cin>>s.uslugi_id;
   cin.get(c);
 
        List_Dogovor *node = new List_Dogovor;
        node->dogovor = s;
        node->next = head_d;
        head_d = node;
};          
 
//////вывод на экран
 
void print_dogovor()
    {
        cout <<"\nlist of dogovor\n! id  !   id_Klienta    !     id_Uslugi   !\n";
                            printf("____________________________________________\n");
        List_Dogovor *node = head_d;
        while(node != NULL)
        {
            printf("%5d !      %5d      !       %5d\n",node->dogovor.Dogovor_id,node->dogovor.klient_id,node->dogovor.uslugi_id);
            node = node->next;
            
        }
                         printf("____________________________________________\n");
    };
///запись в файл
void File_dogovor()//   
    {
 
FILE * f;
f = fopen ("C:/dogovor.txt","r+");
List_Dogovor *temp = head_d; char buf[4096];
while(temp != NULL)
{
    
    sprintf(buf,"%5d%5d%5d\n",temp->dogovor.Dogovor_id,temp->dogovor.klient_id,temp->dogovor.uslugi_id);
        fputs(buf, f);
   
    putc('\n',f);       
    
    temp = temp ->next;
}
fclose(f);
    
}
///из файла заполняется структура
 
void IZ_File_dogovor()
{
    FILE * f;
    char buf[BUFSIZ];
    /* открыть файл, проверить, что открылся... */
 
    f = fopen ("C:/dogovor.txt","r");
    Dogovor a={0,0,0};
 
    while ( fgets(buf,BUFSIZ,f) )
 
    {
        fscanf(f,"%5d%5d%5d",&a.Dogovor_id,&a.klient_id,&a.uslugi_id);
        if(feof(f))
            break;
        List_Dogovor*node = new List_Dogovor;
        node->dogovor = a;
        node->next = head_d;
        head_d = node;
 
    }
 
 
    fclose(f);
 
}
Добавлено через 15 минут
Cra3y,

на экран вывод не правильно написал... выводит вот что:
C++
1
2
3
4
 3000 2000  100
 3001 2001  101
 5555    5    5
 3003 2003  102
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
27.11.2014, 12:02
Цитата Сообщение от Valera1984 Посмотреть сообщение
while ( fgets(buf,BUFSIZ,f) )
А и вот ваша пропавшая первая запись

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
///запись в файл
void File_dogovor() {
    FILE * f;
    f = fopen ("C:/dogovor.txt","r+");
    List_Dogovor *temp = head_d;// char buf[4096];
    while(temp != NULL) {
        //fprintf(f,"%5d%5d%5d\n",temp->dogovor.Dogovor_id,temp->dogovor.klient_id,temp->dogovor.uslugi_id);
        sprintf(buf,"%5d%5d%5d\n",temp->dogovor.Dogovor_id,temp->dogovor.klient_id,temp->dogovor.uslugi_id);
        fputs(buf, f);
        temp = temp ->next;
    }
    fclose(f);    
}
 
///из файла заполняется структура
void IZ_File_dogovor()
{
    FILE * f;
    char buf[BUFSIZ];
    List_Dogovor *node = NULL;
    /* открыть файл, проверить, что открылся... */
 
    if (NULL == (f = fopen ("C:/dogovor.txt","r") return;
    Dogovor a={0,0,0};
 
    // очистка старого списка
    while(head_d) {
        node = head_d->next;
        delete head_d;
        head_d = node;
    }
    while (!feof(f) ) {
        fgets(buf, BUFSIZ, f);
        //fscanf(f,"%5d%5d%5d",&a.Dogovor_id,&a.klient_id,&a.uslugi_id);
        if(3 == sscanf(buf,"%5d%5d%5d",&a.Dogovor_id,&a.klient_id,&a.uslugi_id) {
            node = new List_Dogovor;
            node->dogovor = a;
            node->next = head_d;
            head_d = node;
        }
    }
    fclose(f);
}
1
1 / 1 / 1
Регистрация: 02.02.2014
Сообщений: 109
27.11.2014, 13:02  [ТС]
Cra3y,
Спасибо большое... а не подскажешь как сделать так (если несколько структур) чтобы перед удалением проверять не связана ли id одной структуры сдругой и если связана то выдовать сообщения...

Добавлено через 34 минуты
Cra3y, Скажи пожалуйста что означает эта строка
C++
1
if(3 == sscanf(buf,"%5d%5d%5d",&a.Dogovor_id,&a.klient_id,&a.uslugi_id)
Добавлено через 6 минут
Cra3y, Странно вставляю ваш код поустой экран....
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
27.11.2014, 13:19
Цитата Сообщение от Valera1984 Посмотреть сообщение
Скажи пожалуйста что означает эта строка
"если успешно считалось 3 элемента..."
там еще ')' перед '{' не хватает...

Добавлено через 36 секунд
Цитата Сообщение от Valera1984 Посмотреть сообщение
Скажи пожалуйста что означает эта строка
"если успешно считалось 3 элемента..."
там еще ')' перед '{' не хватает...
1
1 / 1 / 1
Регистрация: 02.02.2014
Сообщений: 109
28.11.2014, 10:32  [ТС]
Cra3y, Да да скобки я расставил...

Добавлено через 3 минуты
Cra3y, Ты крут в программировании Читаю твой код и понимаю как многое я не учитываю...

Добавлено через 21 час 5 минут
Cra3y,Скажи пожалуйста зачем вот этот код:
для чего проверять пусть ли список и если пуст чистить его?
C++
1
2
3
4
if(prev == NULL) {
                head_d = temp->next;
                delete temp;
                temp = head_d;
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
void Delete ( ) {
    int E;
    cout<<"vvedite ID_Dogovora dlia udalenia ";
    cin>>E;
 
    Sviaz_dogovor(E);
 
    List_Dogovor *temp = head_d, *prev = NULL, *curr;
 
    while(temp != NULL) // пока не конец списка
    {
        if(temp->dogovor.Dogovor_id==E)//если информационное поле равно Е
        {
            if(prev == NULL) {
                head_d = temp->next;
                delete temp;
                temp = head_d;
            }
            else {
                prev->next = temp->next;
                delete temp;
                temp = prev->next;
            }
            // break;
            
        }
        else {
            prev = temp;
            temp=temp->next; // перейти к следующему элементу
        }
    }
}
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
28.11.2014, 10:37
Цитата Сообщение от Valera1984 Посмотреть сообщение
зачем вот этот код:
Проверка не является ли удаляемый элемент головой списка, если является то нам надо обновить голову

тут немного криво сделано. в условии можно поставить (temp == head_d)
1
1 / 1 / 1
Регистрация: 02.02.2014
Сообщений: 109
28.11.2014, 15:34  [ТС]
Cra3y, Подскажите как включить методы одного класса в другой?
Делаю вот так:
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
class M_Menu
 {
     Spisok m; // это Имя класса 
     m.IZ_File_trafic();// это методы класса
     m.IZ_File_klientUslugi();
     m.IZ_File_dogovor();   
     m.IZ_File_uslugi();
     m.IZ_File_klient();  / /это методы класса
 public:
    
    
void RYY()
{
    // Надо что бы ими можно было управлять в методах этого класса
 
 
    int n;//номер 
        cout<<endl<<"=== MENU PROGRAMMI ==="<<endl<<endl;
        cout<<endl<<"Viberite tablicu dlia raboti"<<endl; 
        cout<<"1 - Tablica klientov"<<endl; 
        cout<<"2 - Tablica dogovorov"<<endl;
        cout<<"3 - Tablica uslugi"<<endl;
        cout<<"4 - Tablica Klientov i uslug"<<endl;
        cout<<"5 - Tablica trafica"<<endl;
        cout<<"6 - Vichod iz programmi"<<endl;
 
        cout <<endl<<"Vvedite nomer punkta menu: ";
        cin>>n;
        switch(n)
        {
    case 1: menu_dogovor();break;
    case 2: m.print_dogovor();break;
    case 3: m.print_uslugi();break;
    case 4: m.print_KlientUslugi();break;
    case 5: m.print_Trafic();break;
        
        case 6: exit(0); break;
        default :cout<<"Takogo punkta menu net";
 
        }
 };
 
  void menu_dogovor()
   {
      int nn; 
      Spisok m; 
 
       cout<<endl<<"=== PODMENU PROGRAMMI ==="<<endl;
       cout<<endl<<"Viberite punkt menu"<<endl; 
       cout<<"1 - Zagruzit iz faila"<<endl; 
       cout<<"2 - Dobavlenie ilementa"<<endl;
       cout<<"3 - Izmenit ilement"<<endl;
       cout<<"4 - Udalit ilement"<<endl;
       cout<<"5 - Sformirovat otchet po dolgnikam"<<endl;
       cout<<"6 - Sformirovat otchet Summarnii obiem trafica po kajdomu mesiacu"<<endl;
       cout<<"7 - Sformirovat otchet Viruchka po kagdoi usluge"<<endl;
        cout<<"8 - Vernutsia v glavnoe menu"<<endl;
      
       cout <<endl<<"Vvedite nomer punkta menu: ";
       cin>>nn;
       switch(nn)
       {
           
       case 1: m.print_dogovor();break;
       case 2: 
           {m.insert_dogovor();
               m.File_dogovor();
               m.print_dogovor();
           }
           break;
       case 3: m.Redaktirovanie_dogovor();break;
       case 4: m.Delete();break;
       case 5: {m.dolgniki();
             m.File_dolgniki();}
               break;
       case 6:{ m.trafic_mesiac();
           m.File_mesiach_trafic();}break;
       case 7: m.wiruchka();
             m.File_wiruchka();break;
 
      // case 8:me(); break;
       default :cout<<"Takogo punkta menu net";
 
       }
   };
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.11.2014, 15:34
Помогаю со студенческими работами здесь

Добавление и удаление элементов списка, очистка списка, просмотр списка
Добрый вечер! помогите пожалуйста с решением не простой задачи. Предусмотреть меню, позволяющее выполнять основные операции со...

Удаление элемента, стоящего посередине списка (если длина списка нечетна)
Написать функцию, которая удаляет из списка элемент, стоящий в середине (удалённый от начала и конца списка на одинаковое количество...

Однонаправленный список. Вывод элементов, списка. Удаление списка.
Создать однонаправленный список натуральных чисел. Найти и вывести элементы списка, кратные 3. Удалить из списка все эти элементы и вывести...

Удаление элементов списка по номерам другого списка
Доброго времени суток! Подскажите функцию удаления элементов списка с порядковыми номерами из другого списка например: (delete-items...

Создание списка и удаление элеметов этого списка
Доброго времени суток! Прошу помощи реализовать небольшой код jQuery. Необходимо, чтобы после ввода в &lt;Input&gt; и нажатия Enter....


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru