Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
hazerot
2 / 2 / 0
Регистрация: 13.05.2012
Сообщений: 47
#1

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

02.07.2012, 18:41. Просмотров 1442. Ответов 6
Метки нет (Все метки)

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

Двусвязанный список (чтение/запись в файл) - C++
Доброго времени суток. Ни у кого не найдется какого-нибудь простенького примера, на чтение и запись двусвязанного списка в файл? ...

Двумерный массив занести в список - C++
помогите пожалуйста!только начали изучать списки, дали задание, но не могу понять как написать.нужно двумерный массив занести в список,...

Как можно вложить двумерный массив в двумерный? - C++
Нужно написать программу перемножения двух матриц размерностью МxМ, элементы которых, матрицы размерностью КxК... Подскажите (желательно с...

Создать список L3 из элементов, входящих и в список L1 и в список L2 - C++
создать список л3 из элементов входящих и в список л1 и в список л2

3 класса: список, стек(как список), очередь(как список) - C++
препод дал задание: написать 3 класса (список, стек, очередь), методы: вывод, добавление, удаление. Использовать при обращении указатель...

Список: связный список, в котором информация о книгах сортируется по убыванию стоимости. - C++
Друзья помогите с реализацией списка. Нужно запрограммировать связный список, в котором информация о книгах сортируется по убыванию...

6
sandye51
программист С++
685 / 587 / 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;
}
2
hazerot
2 / 2 / 0
Регистрация: 13.05.2012
Сообщений: 47
02.07.2012, 22:07  [ТС] #3
Возник нюанс надеюсь вы в силах помочь. Тот вариант что вы предложили для заполнения списка не совсем верен. Проблема в связках. Получается так что head->down->next->data связка есть, а head->next->down->data нету. То есть элементы вниз связываются по первому столбцу, как это исправить?

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

Добавлено через 31 секунду
Не могли бы вы помочь с программной реализацией?
0
sandye51
программист С++
685 / 587 / 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;
}
1
hazerot
2 / 2 / 0
Регистрация: 13.05.2012
Сообщений: 47
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;
}
0
02.07.2012, 22:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.07.2012, 22:33
Привет! Вот еще темы с ответами:

Вводится число N. Создать список его делителей и вывести список на экран - C++
#include&lt;iostream&gt; #include&lt;stdio.h&gt; #include&lt;malloc.h&gt; #include&lt;string.h&gt; #include&lt;stdlib.h&gt; using namespace std; struct...

Сформировать список из 10 книг, используя динамическую структуру данных односвязный список - C++
друзья спасайте Сформировать список из 10 книг, используя динамическую структуру данных односвязный список С++

list. Cоздать список из результатов(с массивами), а потом просмотреть весь список - C++
Подскажите пожалуйста как мне создать список из моих результатов(с массивами) а потом просмотреть весь список, вот код который имеется ...

Сформировать список из 10 работников, используя динамическую структуру данных двусвязный список - C++
спасайте Сформировать список из 10 работников, используя динамическую структуру данных двусвязный список. Информация о работнике...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

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