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

Двумерный двусвязанный список - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
hazerot
2 / 2 / 0
Регистрация: 13.05.2012
Сообщений: 46
02.07.2012, 18:41     Двумерный двусвязанный список #1
Здравствуйте. Подскажите пожалуйста кто нибудь. Дана структура
Такого вида
C++
1
2
3
4
struct list2d{
int inf;
list2d *next,*prev,*down;
};
Суть вопроса. Как записать матрицу с клавиатуры используя эту структуру.
А если это слишком легко для вас то может еще подскажите как у этой матрицы посчтитать определитель
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.07.2012, 18:41     Двумерный двусвязанный список
Посмотрите здесь:

C++ динамический двумерный массив (заполнить двумерный массив неизвестной длины) C++
Двусвязанный список (чтение/запись в файл) C++
Список: связный список, в котором информация о книгах сортируется по убыванию стоимости. C++
C++ Как можно вложить двумерный массив в двумерный?
C++ 3 класса: список, стек(как список), очередь(как список)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
02.07.2012, 19:01     Двумерный двусвязанный список #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
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
#include <iostream>
#include <cstdlib>
 
struct list2d
{
    list2d *next, *prev, *down;
    int data;
 
    list2d() : next(), prev(), down(), data()
    {
    }
};
 
void print_list2d(struct list2d* head)
{
    struct list2d *current_row = head, *current_cell = NULL;
    while (current_row)
    {
        current_cell = current_row;
        while (current_cell)
        {
            std::cout << current_cell->data << " ";
            current_cell = current_cell->next;
        }
        std::cout << std::endl;
        current_row = current_row->down;
    }
}
 
void delete_list2d(struct list2d* head)
{
    struct list2d *current_row = head, *current_cell = NULL, *to_delete;
    while (current_row)
    {
        current_cell = current_row->next;
        while (current_cell)
        {
            to_delete = current_cell;
            current_cell = current_cell->next;
            delete to_delete;
        }
        to_delete = current_row;
        current_row = current_row->down;
        delete to_delete;
    }
}
 
int main()
{
    unsigned int size;
    
    std::cout << "Enter a matrix size: " << std::endl;
    std::cin >> size;
    
    std::cout << "Etner a matrix: " << std::endl;
    struct list2d* current_row = NULL, *head = new struct list2d();
    current_row = head;
    
    for (unsigned int i = 0; i < size; ++i)
    {
        struct list2d *current_cell = current_row;
        for (unsigned int j = 0; j < size; ++j)
        {
            std::cin >> current_cell->data;
            if (j != size - 1)
            {
                current_cell->next = new struct list2d();
                current_cell->next->prev = current_cell;
                current_cell = current_cell->next;
            }
        }
        
        if (i != size - 1)
        {
            current_row->down = new struct list2d();
            current_row = current_row->down;
        }
    }
    
    print_list2d(head);
    delete_list2d(head);
    
    system("Pause");
    return EXIT_SUCCESS;
}
hazerot
2 / 2 / 0
Регистрация: 13.05.2012
Сообщений: 46
02.07.2012, 22:07  [ТС]     Двумерный двусвязанный список #3
Возник нюанс надеюсь вы в силах помочь. Тот вариант что вы предложили для заполнения списка не совсем верен. Проблема в связках. Получается так что head->down->next->data связка есть, а head->next->down->data нету. То есть элементы вниз связываются по первому столбцу, как это исправить?

Добавлено через 1 минуту
А должны быть связи между всеми элементами матрицы т.е. 2 элемент 1 строки были связан со 2 элементом 2 строки
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
02.07.2012, 22:08     Двумерный двусвязанный список #4
идти по соседним строкам и делать связки сверху вниз
hazerot
2 / 2 / 0
Регистрация: 13.05.2012
Сообщений: 46
02.07.2012, 22:11  [ТС]     Двумерный двусвязанный список #5
Я понимаю что нужно так сделать, но к сожалению программно реализовать не могу, поэтому вынужден обратиться за помощью. Как то эта тема слишком плохо усвоилась

Добавлено через 31 секунду
Не могли бы вы помочь с программной реализацией?
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
02.07.2012, 22:15     Двумерный двусвязанный список #6
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
#include <iostream>
#include <cstdlib>
 
struct list2d
{
    list2d *next, *prev, *down;
    int data;
 
    list2d() : next(), prev(), down(), data()
    {
    }
};
 
void print_list2d(struct list2d* head)
{
    struct list2d *current_row = head, *current_cell = NULL;
    while (current_row)
    {
        current_cell = current_row;
        while (current_cell)
        {
            std::cout << current_cell->data << " ";
            current_cell = current_cell->next;
        }
        std::cout << std::endl;
        current_row = current_row->down;
    }
}
 
void delete_list2d(struct list2d* head)
{
    struct list2d *current_row = head, *current_cell = NULL, *to_delete;
    while (current_row)
    {
        current_cell = current_row->next;
        while (current_cell)
        {
            to_delete = current_cell;
            current_cell = current_cell->next;
            delete to_delete;
        }
        to_delete = current_row;
        current_row = current_row->down;
        delete to_delete;
    }
}
 
int main()
{
    unsigned int size;
    
    std::cout << "Enter a matrix size: " << std::endl;
    std::cin >> size;
    
    std::cout << "Etner a matrix: " << std::endl;
    struct list2d* current_row = NULL, *head = new struct list2d();
    current_row = head;
    
    for (unsigned int i = 0; i < size; ++i)
    {
        struct list2d *current_cell = current_row;
        for (unsigned int j = 0; j < size; ++j)
        {
            std::cin >> current_cell->data;
            if (j != size - 1)
            {
                current_cell->next = new struct list2d();
                current_cell->next->prev = current_cell;
                current_cell = current_cell->next;
            }
        }
        
        if (i != size - 1)
        {
            current_row->down = new struct list2d();
            current_row = current_row->down;
        }
    }
    
    struct list2d *str1 = head, *str2 = head->down;
    while (str2)
    {
        struct list2d *cell1 = str1->next, *cell2 = str2->next;
        while (cell1)
        {
            cell1->down = cell2;
            cell1 = cell1->next;
            cell2 = cell2->next;
        }
        str1 = str2;
        str2 = str2->down;
    }
    
    print_list2d(head);
    delete_list2d(head);
    
    system("Pause");
    return EXIT_SUCCESS;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.07.2012, 22:33     Двумерный двусвязанный список
Еще ссылки по теме:

list. Cоздать список из результатов(с массивами), а потом просмотреть весь список C++
C++ создать список л3 из элементов входящих и в список л1 и в список л2
C++ Сформировать список из 10 книг, используя динамическую структуру данных односвязный список

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

Или воспользуйтесь поиском по форуму:
hazerot
2 / 2 / 0
Регистрация: 13.05.2012
Сообщений: 46
02.07.2012, 22:33  [ТС]     Двумерный двусвязанный список #7
sandye51, Работает
И последний момент я хотел бы у вас уточнить. Используя все то что вы мне написали. Я попытался высчитать определитель по минорам. Но как ни странно программа не работает. Просто напросто циклится.
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
127
list2d* func1(list2d *a,int d){
    int k=1;
    struct list2d* current_row = NULL, *head = new struct list2d();
    current_row = head;
    list2d *b=new list2d,*c=new list2d;
    b=a;c=a;
for (;b;b=b->down,k++)
    {
        if(k==d)
            b=b->down;
        
        
        
        struct list2d *current_cell = current_row;
        
        c=b;
        for (;c;c=c->next)
        {
            current_cell->inf=c->inf;
            if (c->next)
            {
                current_cell->next = new struct list2d();
                current_cell->next->prev = current_cell;
                current_cell = current_cell->next;
            }
        }
        
        if (b->down)
        {
            current_row->down = new struct list2d();
            current_row = current_row->down;
        }
        
    }
 
struct list2d *str1 = head, *str2 = head->down;
while (str2)
    {
        struct list2d *cell1 = str1->next, *cell2 = str2->next;
        while (cell1)
        {
            cell1->down = cell2;
            cell1 = cell1->next;
            cell2 = cell2->next;
        }
        str1 = str2;
        str2 = str2->down;
    }
return head;
 
}
void func(list2d *a,int &i,int &j){
    list2d *asw=a;
    while(asw){asw=asw->next;i++;}
    asw=a;
    while(asw){asw=asw->down;j++;}
}
int templf(list2d *a){
    int i=1,j=1,d=1,s=0;
    func(a,i,j);
    if(i==3 && j==3)
        return (a->inf*a->down->next->inf - a->next->inf*a->down->inf);
    else{
        list2d *b=a;
        while(b->down){
            list2d *li=new list2d;
            li=func1(b->next,d);
            
            if(d+1%2==0){
                //list2d *li=new list2d;
                //li=func1(b->next,d);
                s+=b->inf*templf(li);
            }
            else{
                //list2d *li=new list2d;
                //li=func1(b->next,d);
                s-=b->inf*templf(li);
            }
 
        }
        b=b->down;
    }
    return s;
}
int main(){
    list2d *w;
int s;
int size=3;
struct list2d* current_row = NULL, *head = new struct list2d();
    current_row = head;
for (int i = 0; i < size; ++i)
    {
        struct list2d *current_cell = current_row;
        for (int j = 0; j < size; ++j)
        {
            cin >> current_cell->inf;
            if (j != size - 1)
            {
                current_cell->next = new struct list2d();
                current_cell->next->prev = current_cell;
                current_cell = current_cell->next;
            }
        }
        
        if (i != size - 1)
        {
            current_row->down = new struct list2d();
            current_row = current_row->down;
        }
    }
struct list2d *str1 = head, *str2 = head->down;
while (str2)
    {
        struct list2d *cell1 = str1->next, *cell2 = str2->next;
        while (cell1)
        {
            cell1->down = cell2;
            cell1 = cell1->next;
            cell2 = cell2->next;
        }
        str1 = str2;
        str2 = str2->down;
    }
s=templf(head);
cout<<s<<endl;
    return EXIT_SUCCESS;
}
Yandex
Объявления
02.07.2012, 22:33     Двумерный двусвязанный список
Ответ Создать тему
Опции темы

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