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

Как сделать односвязный список в узле дерева

29.12.2013, 15:51. Показов 814. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Ребят подскажите, пожалуйста, как сделать односвязный список в узле дерева?

Нужно написать программу учета нарушений ПДД. Для каждого а/м нужно хранить в базе список нарушений. Для каждого нарушения фиксируется дата, время, вид нарушения и размер штрафа. При оплате всех штрафов а/м удаляется из базы. Ключом узла д/б номер а/м.

код списка:
list.h
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
#ifndef LIST_H
#define LIST_H
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
 
struct LIST
{
    char date[15];
    char time[15];
    char narushenie[50];
    float price;
    struct LIST *next;
};
 
typedef struct LIST LIST;
 
class CL_LIST
{
private:
    LIST *first, *cur;
    int GoToPrev();             //переход в предыдущий элемент
    void GoToFirst();           //перейти в начало списка
    int IsEnd();                //конец списка ?
    int Move();                 //движение вправо по списку
    int IsEmpty();              //пустой ли список ?
public:
    CL_LIST();                  //конструктор
    void AddFirst(char *_date, char *_time, char *_narushenie, float _price);       //добавление первого элемента
    void AddAfloCur(char *_date, char *_time, char *_narushenie, float _price);     //добавление после текущего
    int GetElem();              //возвращает текущий элемент
    void DeleteFirst();         //удаление первого элемента
    int DeleteCur();            //удаление текущего
    int Print();                //печать списка
    int DeleteKey(char *_date, char *_time);            //удаление по ключу
};
 
#endif
list.cpp
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
120
121
122
123
124
125
126
#include "list.h"
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
 
 
CL_LIST::CL_LIST() { first = NULL; cur = NULL;}
 
int CL_LIST::IsEmpty() { return first == NULL; }
 
void CL_LIST::AddFirst(char *_date, char *_time, char *_narushenie, float _price)
{
    LIST *tmp = new struct LIST;
    strcpy(tmp->date, _date);
    strcpy(tmp->time, _time);
    strcpy(tmp->narushenie, _narushenie);
    tmp->price = _price;
    tmp->next = first;
    first = cur = tmp;
}
 
void CL_LIST::AddAfloCur(char *_date, char *_time, char *_narushenie, float _price)
{
    if(IsEmpty(){
        AddFirst(_date, _time, _narushenie, _price);
        return;
    }
 
    LIST *tmp = new struct LIST;
    strcpy(tmp->date, _date);
    strcpy(tmp->time, _time);
    strcpy(tmp->narushenie, _narushenie);
    tmp->price = _price;
    tmp->next = cur->next;
    cur->next = tmp;
    cur = tmp;
}
 
int CL_LIST::IsEnd() { return cur->next == NULL; }
 
void CL_LIST::GoToFirst() { cur = first; }
 
int CL_LIST::GetElem() { return cur->data; }
 
int CL_LIST::Move() 
{
    if(IsEnd()) return 1;
    cur = cur->next;
    return 0;
}
 
int CL_LIST::GoToPrev()
{
    if(IsEmpty()) return 1;
    if(cur == first) return 2;
    
    LIST *tmp = cur;
    GoToFirst();
    while(cur->next != tmp) Move();
 
    return 0;
}
 
void CL_LIST::DeleteFirst()
{
    if(IsEmpty()) { printf("pustoi spisok\n"); return; }
    LIST *tmp = first->next;
    delete first;
    first = tmp;
}
 
int CL_LIST::DeleteCur()
{
    if(IsEmpty()) return 1;
 
    if(cur == first)
    {
        DeleteFirst();
        return 0;
    }
    else
     {
        LIST *tmp = new struct LIST;
        tmp = cur;
        GoToPrev();
        cur->next = tmp->next;
        delete tmp;
    }
    return 0;
}
 
int CL_LIST::Print()
{
    if(IsEmpty()) return 1;
 
        GoToFirst();
        cout << "Список нарушений:" << endl
            << "Дата    Время     Вид нарушения   Штраф" << endl
            << cur->date << cur->time << cur->narushenie << cur->price << endl;
    while(!IsEnd()){
        Move();
        cout << cur->date << cur->time << cur->narushenie << cur->price << endl;
    }
 
    return 0;
}
 
int CL_LIST::DeleteKey(char *_date, char *_time)
{
  if(IsEmpty(f)) 
        return 1;
 
    GoToFirst();
    if(strcmp(first->date, _date) == 0 && strcmp(first->time, _time) == 0)
        DeleteFirst();
    while(!IsEnd())
    {
        Move();
        if(strcmp(cur->date, _date) == 0 && strcmp(cur->time, _time) == 0)
        {
            DeleteCur();
            return 0;
        }
    }
    return 0;
}
Дерево:
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
#ifndef TREE_H
#define TREE_H
 
#include <stdio.h>
#include <stdlib.h>
 
class tree
 { 
 private:
    int info;   //Информационная часть
    tree *left; 
    tree *right;
 
    public:
        tree *root;
        tree() {root = NULL;}
        void stree(tree *r, tree *previous, int info);  //Добавление элемента в дерево
        tree *dtree(tree *r, int key); 
        void preorder(tree *r); 
        void inorder(tree *r); 
        void postorder(tree *r); 
        void print_tree(tree *r, int L); 
        tree *seach_tree(tree *r, int key);
 
 };
#endif
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
120
121
122
#include "tree.h"
 
// добавление элементов в дерево
void tree:: stree( tree *r, tree *previous, int info) //Аргументы: Указатель на корень, Указатель на предыдущий узел, инфомационная часть
{
    if(r==NULL) {
    r=new tree;
    if (r==NULL) { printf("Heдocтaтoчнo пaмяти\n"); return;}
    r->left=NULL; 
    r->right=NULL; 
    r->info=info;
    if (root==NULL)  root=r;            //пepвый элeмeнт 
    else 
    {
        if (info < previous->info) previous->left=r;
        else    previous->right=r;
    } 
        return;
    }
        if (info < r->info) stree(r->left, r, info); 
        else stree(r->right, r, info);
}
 
// печать
void tree::print_tree(tree *r, int L)
{ 
    int i;
    if(r==NULL) return;
    print_tree(r->right, L+1); 
    printf ("\n");
    for(i=0;i<L;i++) printf("\t");
    printf("%d \n",r->info); 
    print_tree(r->left, L+1);
}
 
// последовательный обход дерева
void tree::inorder (tree *r) 
{ 
    if(r==NULL) return;
    inorder(r->left);
    if(r->info) printf("\t%d",r->info);
    inorder(r->right);
}
 
// обход дерева нисходящий
void tree:: preorder(tree *r)
{
    if(r==NULL) return;
    if(r->info) printf("\t%d",r->info); 
    preorder(r->left); 
    preorder(r->right);
}
 
// обход дерева восходящий
void tree::postorder(tree *r)
{
    if(r==NULL) return;
    postorder(r->left) ; 
    postorder(r->right); 
    if(r->info) printf("\t%d",r->info); 
}
 
// поиск по дереву
tree* tree::seach_tree(tree *r, int key)
{
    if(r==NULL) return r;               // пустое дерево
    while(r->info!=key) {
          if (key < r->info) r=r->left; 
          else               r=r->right; 
          if (r==NULL) break;
    }
    return r;
}
 
 
 
tree*  tree::dtree(tree *r, int key)
{
    tree *p, *p2;
 
    if(r == NULL) return r;         // элемент нe найден
    if (r->info==key) {             // delete root 
        //this means an empty tree 
        if (r->left==r->right){
            free(r);
            if (r==root) root = NULL;
            return NULL;
        }
        else if (r->left==NULL) {
            p = r->right; free(r) ;
            if (r==root) root = p; 
            return p;
        }
        else if (r->right==NULL) { 
            p = r->left;
            free(r) ;
            if (r==root) root = p; 
            return p;
        }
        else 
        {
            p2 = r;
            p = r->right; 
            while(p->left) {p2 = p; p = p->left; }
            p->left = r->left; 
            
            if(p2 != r)
            {
                p2->left = p->right;
                p->right = r->right;
            }
 
            free(r);
            if (r == root) root = p; 
 
            return p;
        }
    }
    if (r->info<key) r->right = dtree(r->right, key); 
    else r->left = dtree(r->left,key); 
    return r;
}

Пробовал через наследование, что-то не получилось.... Подскажите плз, как в узле сделать список
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.12.2013, 15:51
Ответы с готовыми решениями:

Перенос текста в узле дерева на новую строку
Всем привет! Можно ли сделать так, чтобы текст переносился на новую строку по достижении конца окна...

нужно срочно сделать односвязный список
У меня программа вроде работает,но надо как-то надо добавлять значения..У меня не получается)* ...

Создать класс «Квартира», в котором список комнат реализовать как односвязный список
Добрый день,написал фот такой клас по заданию:Создать класс «Квартира», в котором список комнат...

Список: Как организовать односвязный список в c#?
Здравствуйте. Как организовать односвязный список в c#? Обычный List&lt;T&gt; не подойдёт. Нужен именно...

1
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
08.01.2014, 18:18 2
а stl использовать можно?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
...
typedef std::string CarId;
 
struct ViolationInfo
{
 ...
};
 
 
typedef std::map< CarId, std::list<ViolationInfo> > ViolationsMap;
 
// ViolationsMap - это и есть дерево списков нарушений,
// где в качестве ключа используется айдишник машины.
 
...
0
08.01.2014, 18:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.01.2014, 18:18
Помогаю со студенческими работами здесь

Однонаправленный связный список с полями данных в самом узле списка
Добрый день! Правильно я поняла, что однонаправленный связный список с полями данных в самом узле...

Как отсортировать односвязный список????
class lib { struct element { string data; element *next; element (string dat,...

Как правильно вывести односвязный список?
Здравствуйте! Нужно реализовать в Turbo Pascal очередь, в том числе и вывод её на печать после...

Как вывести односвязный список в обратном порядке?
Всем привет. Подскажите, пожалуйста, как вывести односвязный список в обратном порядке.


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

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