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

Создать линейный список по уже имеющийся структуре "Записная книжка" - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Mako-chi
0 / 0 / 0
Регистрация: 17.04.2013
Сообщений: 3
17.04.2013, 10:03     Создать линейный список по уже имеющийся структуре "Записная книжка" #1
У меня довольно таки сложная последняя лабораторная.(для меня, по крайней мере)
Нужно создать линейный список по уже имеющийся структуре(это у меня было в первой лабе)
1. Линейный список
а) добавление записи
б) удаление записи
в) редактирование полей записи
г) поиск элемента по заданному полю
д) сортировка по заданному полю
2. чтение списка из файла и записи в файл
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
#include <iostream>
 
#include <conio.h>
 
#include <stdio.h>
 
using namespace std;
 
 
 
struct book
 
{ char name [10];
 
long int number;
 
int birthday[3];
 
};
 
 
int main()
 
 
{ 
book N[5];
 
N[0].name[10]= 'Mariya'; N[0].number=89622293936; N[0].birthday[0]=1994; N[0].birthday[1]=12; N[0].birthday[2]=15;
 
N[1].name[10]= 'Sasha'; N[1].number=89098050308; N[1].birthday[0]=1995; N[1].birthday[1]=2; N[1].birthday[2]=21;
 
N[2].name[10]= 'Katya'; N[2].number=89508003050; N[2].birthday[0]=1991; N[2].birthday[1]=5; N[2].birthday[2]=1;
 
N[3].name[10]= 'Sveta'; N[3].number=89135054108; N[3].birthday[0]=1987; N[3].birthday[1]=8; N[3].birthday[2]=15;
 
N[4].name[10]= 'Vika'; N[4].number=89037814849; N[4].birthday[0]=1990; N[4].birthday[1]=6; N[4].birthday[2]=30;
 
 
 
for( int i=0; i<3; i++)
 
cout<<N[i].name<<endl<<N[i].numder<<endl<<N[i].birthday[0]<<"."<<N[i].birthday[1]<<"."<<N[i].birthday[0]<<endl<<endl;
 
return 0;
 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.04.2013, 10:03     Создать линейный список по уже имеющийся структуре "Записная книжка"
Посмотрите здесь:

C++ Записная книжка: Предусмотреть возможность работы с произвольным числом записей
Электронная записная телефонная книжка C++
C++ Создать однопоточный линейный список и сортировать методом пузырька
C++ Создать линейный двунаправленный список, упрорядоченный по убыванию
C++ Линейный список не получается создать
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
17.04.2013, 17:07     Создать линейный список по уже имеющийся структуре "Записная книжка" #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Mako-chi, вот накидал пару функций, можешь разобраться, я конечно не слишком селен в объяснении, но попробовал

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
#include <iostream>
#include <locale>
using namespace std;
 
/*твоя структура*/
struct book
{ 
    char name[10];
    long int number;
    int birthday[3];
 
    /*я добавил функцию для ввода данных*/
    void input(){
        cout << "Enter the name: ";
            cin >> name;
        cout << "Enter the number: ";
            cin >> number;
        cout << "Enter birthday: ";
            cin >> birthday[0] >> birthday[1] >> birthday[2];
    }
 
    /*функция для вывода данных*/
    void output(){
        cout << name << '\t' << number << '\t' << birthday[0] << '.' <<
            birthday[1] << '.' << birthday[2] << '\n';
    }
};
 
/*в элементах списка находяться указатели на нашу стрктуру
и каждый элмент списка указывает на следующий*/
struct ListNode
{
    book *data;
    ListNode *next;
};
 
class List
{
    private:
        ListNode *first;            //голова списка
 
    public:
        List()
        {
            first = NULL;           //список изначально пустой
        }
 
        void addAtFront()               //функция добавления в начало списка
        {
            book *in = new book;        //выделяем память под указатель на структуру
            in -> input();              //вводим данные о человеке
 
            ListNode *Ptr = new ListNode;       //выделяем память под элемент списка
            Ptr -> data = in;                   //кладем данные о человеке
            Ptr -> next = NULL;                 //следующих данных нет(NULL - признак конца списка)
 
            if(first == NULL)               //если список пуст
            {
                first = Ptr;                //введенные данные будут первой записью
            }
            else                            //иначе
            {
                ListNode *Ptr_f = first;            //первая запись(голова списка)
                first = Ptr;                        //головой становится новая запись
                Ptr -> next = Ptr_f;                //новая запись указывает на бывшую голову
            }
        }
 
        void removeAtFront()            //удаление первой записи
        {
            if(first == NULL)                   //если список пуст
                wcout << L"Список пуст!\n";
            if(first -> next == NULL)           //для списка с 1 элементом
            {
                delete first;               //удалили голову
                first = NULL;               //список пуст
            }
            else
            {
                ListNode *temp = first -> next; //элемент после головы(будет новой головой)
 
                delete first;       //удаляем голову
                first = temp;       //теперь следующий элемент после головы стал головой
            }
        }
 
        void showItem()                 //вывод списка
        {
            ListNode *current(first);       //голова списка
 
            if(current == NULL)             //если список пуст выводим сообщение
                wcout << L"Список пуст!";
            else
            {
                wcout << L"Список: ";
                while(current != NULL)          //идем по списку
                {
                    current -> data -> output();        //выводим элемент
                    current = current -> next;          //переходим к следующему
                }
            }
 
            cout << endl;
        }
};
 
int main()
{
    wcout.imbue(locale(".866"));
    wcin.imbue(locale(".866"));
 
    List op;                    //объявляем объект класса
    op.addAtFront();            //вызов метода добавления элемента списка
    op.showItem();              //вызов метода вывода списка на консоль
 
    cout << "\n\n";
    return 0;
}
Mako-chi
0 / 0 / 0
Регистрация: 17.04.2013
Сообщений: 3
19.04.2013, 05:29  [ТС]     Создать линейный список по уже имеющийся структуре "Записная книжка" #3
yoghurt92, если не вводить данные человеке через клавиатуру, а считывать с файла, как это будет выглядеть?
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
19.04.2013, 08:30     Создать линейный список по уже имеющийся структуре "Записная книжка" #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Mako-chi, вот так

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
#include <iostream>
#include <fstream>
#include <locale>
using namespace std;
 
/*твоя структура*/
struct book
{ 
    char name[10];
    long int number;
    int birthday[3];
 
    /*я добавил функцию для ввода данных*/
    void input(ifstream &fin){
        fin >> name >> number >> birthday[0] >>
            birthday[1] >> birthday[2];
    }
 
    /*функция для вывода данных*/
    void output(){
        cout << name << '\t' << number << '\t' << birthday[0] << '.' <<
            birthday[1] << '.' << birthday[2] << '\n';
    }
};
 
/*в элементах списка находяться указатели на нашу стрктуру
и каждый элмент списка указывает на следующий*/
struct ListNode
{
    book *data;
    ListNode *next;
};
 
class List
{
    private:
        ListNode *first;            //голова списка
 
    public:
        List()
        {
            first = NULL;           //список изначально пустой
        }
 
        void addAtFront(ifstream &fin)         //функция добавления в начало списка
        {
            book *in = new book;        //выделяем память под указатель на структуру
            in -> input(fin);              //вводим данные о человеке
 
            ListNode *Ptr = new ListNode;       //выделяем память под элемент списка
            Ptr -> data = in;                   //кладем данные о человеке
            Ptr -> next = NULL;                 //следующих данных нет(NULL - признак конца списка)
 
            if(first == NULL)               //если список пуст
            {
                first = Ptr;                //введенные данные будут первой записью
            }
            else                            //иначе
            {
                ListNode *Ptr_f = first;            //первая запись(голова списка)
                first = Ptr;                        //головой становится новая запись
                Ptr -> next = Ptr_f;                //новая запись указывает на бывшую голову
            }
        }
 
        void removeAtFront()            //удаление первой записи
        {
            if(first == NULL)                   //если список пуст
                wcout << L"Список пуст!\n";
            if(first -> next == NULL)           //для списка с 1 элементом
            {
                delete first;               //удалили голову
                first = NULL;               //список пуст
            }
            else
            {
                ListNode *temp = first -> next; //элемент после головы(будет новой головой)
 
                delete first;       //удаляем голову
                first = temp;       //теперь следующий элемент после головы стал головой
            }
        }
 
        void showItem()                 //вывод списка
        {
            ListNode *current(first);       //голова списка
 
            if(current == NULL)             //если список пуст выводим сообщение
                wcout << L"Список пуст!";
            else
            {
                wcout << L"Список:\n";
                while(current != NULL)          //идем по списку
                {
                    current -> data -> output();        //выводим элемент
                    current = current -> next;          //переходим к следующему
                }
            }
 
            cout << endl;
        }
};
 
int main()
{
    wcout.imbue(locale(".866"));
    wcin.imbue(locale(".866"));
 
    ifstream fin("file.txt", ios::in);
 
    List op;                    //объявляем объект класса
    op.addAtFront(fin);            //вызов метода добавления элемента списка
    op.addAtFront(fin);            //вызов метода добавления элемента списка
    op.showItem();              //вызов метода вывода списка на консоль
 
    fin.close();
    cout << "\n\n";
    return 0;
}
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
22.04.2013, 13:52     Создать линейный список по уже имеющийся структуре "Записная книжка" #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Mako-chi, ну как основу могу вот так показать

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
#include <iostream>
#include <list>
#include <cstdlib>
#include <algorithm>
using namespace std;
 
struct Struct{
    int data;
};
 
//добавление в начало
void push(list<Struct> &_coll, Struct &op){
    _coll.push_front(op);
}
 
//удаление из начала
void pop(list<Struct> &_coll){
    _coll.pop_front();
}
 
//редактирование
void edit(list<Struct> &_coll, int data_f){
    list<Struct>::value_type value;
    value = *find_if(_coll.begin(), _coll.end(), [data_f](Struct const& n){
        return n.data == data_f;});
 
    //do something
}
 
void print(Struct &op){
    cout << op.data << endl;
}
 
//вывод
void show(list<Struct> &_coll){
    for_each(_coll.begin(), _coll.end(), print);
}
 
int main() 
{ 
    list<Struct> coll;
 
    Struct op1, op2;
    op1.data = 1;
    op2.data = 2;
 
    push(coll, op1);
    push(coll, op2);
 
    show(coll);
 
    edit(coll, 1);
 
    cout << "\n\n";
    return 0; 
}
Yandex
Объявления
22.04.2013, 13:52     Создать линейный список по уже имеющийся структуре "Записная книжка"
Ответ Создать тему
Опции темы

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