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

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

Восстановить пароль Регистрация
 
Valera1984
1 / 1 / 0
Регистрация: 02.02.2014
Сообщений: 104
27.11.2014, 08:31     Редактирование и удаление из списка #1
Код не корректно работает функция (удаления и редактирования) удаляется не тот элемент из списка который надо, а после редактирования из файла не выводится первый элемент... подправьте пожалуйста....
структура:
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;
    }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2014, 08:31     Редактирование и удаление из списка
Посмотрите здесь:

C++ удаление списка в с++
1 Отсортировать по возрастанию (методом выбора). 2 добавление, удаление, редактирование элемента списка (на С без плюсов). C++
Редактирование произвольного текста: удаление слова с заданным номером C++
C++ Удаление и редактирование определённой строки
C++ Сортировка односвязного списка (нужно редактирование)
Формирование упорядоченного списка из целых чисел; удаление из списка отрицательные чисел и удвоение положительных C++
C++ Редактирование(добавление/удаление) объемных текстовых файлов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Max Dark
В поиске работы
 Аватар для Max Dark
1547 / 1400 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
27.11.2014, 11:02     Редактирование и удаление из списка #2
удаление: вы удаляете следующий элемент, а не текущий
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;
Valera1984
1 / 1 / 0
Регистрация: 02.02.2014
Сообщений: 104
27.11.2014, 11:34  [ТС]     Редактирование и удаление из списка #3
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, По удалению я разобрался Спасибо... Вы описали двусвязный список, а у меня односвязный...
Max Dark
В поиске работы
 Аватар для Max Dark
1547 / 1400 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
27.11.2014, 11:34     Редактирование и удаление из списка #4
Valera1984, функции чтения и записи в файл покажите(а лучше сразу весь код)
Valera1984
1 / 1 / 0
Регистрация: 02.02.2014
Сообщений: 104
27.11.2014, 11:35  [ТС]     Редактирование и удаление из списка #5
Cra3y, Подскажи что не так с редактированием....?
Max Dark
В поиске работы
 Аватар для Max Dark
1547 / 1400 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
27.11.2014, 11:35     Редактирование и удаление из списка #6
Цитата Сообщение от Valera1984 Посмотреть сообщение
. Вы описали двусвязный список, а у меня односвязный...
нет, я просто сохранял предидущий элемент
Valera1984
1 / 1 / 0
Регистрация: 02.02.2014
Сообщений: 104
27.11.2014, 11:55  [ТС]     Редактирование и удаление из списка #7
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
Max Dark
В поиске работы
 Аватар для Max Dark
1547 / 1400 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
27.11.2014, 12:02     Редактирование и удаление из списка #8
Цитата Сообщение от 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);
}
Valera1984
1 / 1 / 0
Регистрация: 02.02.2014
Сообщений: 104
27.11.2014, 13:02  [ТС]     Редактирование и удаление из списка #9
Cra3y,
Спасибо большое... а не подскажешь как сделать так (если несколько структур) чтобы перед удалением проверять не связана ли id одной структуры сдругой и если связана то выдовать сообщения...

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

Добавлено через 36 секунд
Цитата Сообщение от Valera1984 Посмотреть сообщение
Скажи пожалуйста что означает эта строка
"если успешно считалось 3 элемента..."
там еще ')' перед '{' не хватает...
Valera1984
1 / 1 / 0
Регистрация: 02.02.2014
Сообщений: 104
28.11.2014, 10:32  [ТС]     Редактирование и удаление из списка #11
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; // перейти к следующему элементу
        }
    }
}
Max Dark
В поиске работы
 Аватар для Max Dark
1547 / 1400 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
28.11.2014, 10:37     Редактирование и удаление из списка #12
Цитата Сообщение от Valera1984 Посмотреть сообщение
зачем вот этот код:
Проверка не является ли удаляемый элемент головой списка, если является то нам надо обновить голову

тут немного криво сделано. в условии можно поставить (temp == head_d)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.11.2014, 15:34     Редактирование и удаление из списка
Еще ссылки по теме:

C++ Написать код программы, выполняющей растяжку списка и вставку, удаление из списка и сжатие списка
Удаление элемента списка и всего списка C++
C++ Сортировка\редактирование\удаление бинарного файла
C++ Удаление из списка
Удаление элементов из односвязного списка списка C++

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

Или воспользуйтесь поиском по форуму:
Valera1984
1 / 1 / 0
Регистрация: 02.02.2014
Сообщений: 104
28.11.2014, 15:34  [ТС]     Редактирование и удаление из списка #13
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";
 
       }
   };
Yandex
Объявления
28.11.2014, 15:34     Редактирование и удаление из списка
Ответ Создать тему
Опции темы

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