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

исправить двусвязный список? - C++

Восстановить пароль Регистрация
 
2xep
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 12
23.06.2011, 16:06     исправить двусвязный список? #1
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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#include "stdafx.h"
#include "conio.h"
#include "locale.h"
#include "string.h" // для strcmp();
#include <ctype.h>
#include <stdlib.h>
struct student
{
    char name[20];
    int group;
    char ocenki[11];
    struct student *prior; //Указатель на предыдущий элемент:
    struct student *next;  //Указатель на следущий элемент:
 
};
void pop(student* b)
{
student* tmp=NULL;
while(b!=NULL)
{
tmp=b;
b=b->prior;
delete tmp;
}
}
void input(struct student *h, int k)
{
    struct student *ptr;
    ptr=new(student);
    ptr->next=h;
    ptr->prior=h->prior;
    printf("Введите имя студента: ");
    scanf("%s", ptr->name);
    printf("Введите его группу: ") ;
    scanf("%d", &ptr->group);
    printf("Введите его оценки: ");
    scanf("%s", ptr->ocenki);
    //заполняем полученые данные
    if (k==0)
    {
        h->next=ptr;
        h->prior=ptr;
    }
    else
    {
        h->prior->next=ptr;
        h->prior=ptr;
    }
}
void print(struct student *h,int k)
{
    struct student *ptr;
    ptr=new(student);
    ptr=h;
    if (k==0) printf("База пуста");
    else
    {
    //  struct student *ptr;
    //  int i;
    //  ptr=new(student);
        ptr=h->next;
        int e;
        printf("weqw ");
            scanf("%d",&e);
        {
    int j=1;
        printf("____________________________________________\n"
               "| № |   cтудент   |   группа    |  оценки   |\n"
               "--------------------------------------------\n");
 
        //while(ptr->next==NULL);
        for(int i=0;i<k;i++)
         {
             if (e==0)
             {
        printf("| %d |",j++);    
        printf("  %20s |",ptr->name);
        printf("  %d |",ptr->group);
        printf(" %11s |\n",ptr->ocenki);
             }
        ptr=ptr->next;  
          }
        if (e==1)
        {
            for(int i=0;i<k;i++)
         {
             ptr=ptr->prior;  
        printf("| %d |",j++);    
        printf("  %20s |",ptr->name);
        printf("  %d |",ptr->group);
        printf(" %11s |\n",ptr->ocenki);
        
          }
        }
         
 
}
    }
}
 
 
 
 
 
void init(struct student *h)
{
    //создание наального элемента
    h = new(student); 
    h->next=h; 
    h->prior=h; 
}
int _tmain(int argc, _TCHAR* argv[])
{
int a;//номер работы из меню
int k=0;
setlocale(LC_ALL, "Russian");
struct student *h;
h=new(student);
init(h);
//Вывод меню на экран
while(1)
{
    system("cls");
    printf("            \"заявки\"        \n"
        "                МЕНЮ                  \n"
        "1. Ввод сведений о новом студенте.\n"
        "2. Просмотр всех студентов\n"
        "3. Окончание работы.\n");
//Ввод и обработка номера пункта меню
printf("\n\nВведите номер пункта меню: ");
scanf("%d", &a);
system("cls");
switch(a)
{
case 1: 
          input(h,k);  //1. Ввод сведений о новом студенте.
          k++;
          break;
case 2: 
         print(h,k);  //3. Просмотр содержимого базы данных.
          _getch();
          break;
 
case 3: 
          return 0; //Окончание работы.
          break;
 
default: 
          printf("\nНеверно указан номер пункта меню!\n");
          _getch();
}   
}
pop(h);
}
Суть проблемы в общем ззаключается в том, что преподу нашему делать нечего во время сессии.

Ей не нравится переменная К, которая выполняет функцию счетчика, она считает кол-во введенных элементов в структуру, пытался ее убрать, но ничего хорошего не вышло, так что выкладываю изначальный код. Поможете с проблемой?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.06.2011, 16:06     исправить двусвязный список?
Посмотрите здесь:

Двусвязный список C++
Двусвязный список C++
C++ двусвязный список
Переделать двусвязный список в двусвязный кольцевой C++
C++ двусвязный список
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
voral
345 / 325 / 46
Регистрация: 16.03.2008
Сообщений: 1,692
23.06.2011, 16:38     исправить двусвязный список? #2
У вас и по заданию нужен "закольцованный" список?

Во первых, имхо, у вас всегда один лишний элемент. Тот который в инит задается.
Если нужен именно замкнутый список, то создайте переменную хранящую указатель на текущий элемент. Если этот указатель NULL - значит список пуст (в вашем случае правда при пустом списке будет указывать на этот самый пустой элемент). При выводе обходите через цикл по next или (prior) пока опять не не ткнетесь на тот с которого начали.

Если же есписок замыкать не надо, то у первого элемента prior должен быть равен NULL а у последнего next = NULL

Добавлено через 5 минут
И еще ваша ф-ия pop ни когда не работает
2xep
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 12
24.06.2011, 05:05  [ТС]     исправить двусвязный список? #3
нет нет, список нужен что не наесть обычный. не "закальцованный". а нащет попа знаю. пеерсунуть выхов надо)
voral
345 / 325 / 46
Регистрация: 16.03.2008
Сообщений: 1,692
24.06.2011, 08:26     исправить двусвязный список? #4
я, б что то типа этого сделал. Правда, что у вас в принте делается не осознал, подредактируете если нужно
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
#include "stdafx.h"
#include "conio.h"
#include "locale.h"
#include "string.h" // для strcmp();
#include <ctype.h>
#include <stdlib.h>
struct student
{
        char name[20];
        int group;
        char ocenki[11];
        struct student *prior; //Указатель на предыдущий элемент:
        struct student *next;  //Указатель на следущий элемент:
 
};
struct student *h, *last;
 
void pop(student* b)
{
    student* tmp=NULL;
    while(h!=NULL)
    {
        tmp=h->next;
        delete h;
        h=tmp;
    }
}
void input()
{
        struct student *ptr;
        ptr=new(student);
        printf("Введите имя студента: ");
        scanf("%s", &ptr->name);
        printf("Введите его группу: ") ;
        scanf("%d", &ptr->group);
        printf("Введите его оценки: ");
        scanf("%s", &ptr->ocenki);
        //заполняем полученые данные
        if (h==NULL)
            h=ptr;
        else
        {
            ptr->prior=last;
            last->next=ptr;
        };
        last=ptr;
}
void print()
{
    student* tmp=h;
    if (h==NULL) printf("База пуста");
    else
    {
        printf(    "____________________________________________\n"
                "| № |   cтудент   |   группа    |  оценки   |\n"
                "--------------------------------------------\n");
        int j;
        for (tmp=h,j=1;tmp!=NULL;tmp=tmp->next,j++)
            printf("| %d |  %20s |  %d | %11s |\n",j,tmp->name,tmp->group,tmp->ocenki);
    }
}
int main(int argc, char** argv)
{
    int a;//номер работы из меню
    setlocale(LC_ALL, "Russian");
//Вывод меню на экран
    do {
        system("clear");
        printf("            \"заявки\"        \n"
                "                МЕНЮ                  \n"
                "1. Ввод сведений о новом студенте.\n"
                "2. Просмотр всех студентов\n"
                "3. Окончание работы.\n");
//Ввод и обработка номера пункта меню
        printf("\n\nВведите номер пункта меню: ");
        scanf("%d", &a);
        system("clear");
        switch(a)
        {
            case 1:
                input();  //1. Ввод сведений о новом студенте.
                break;
            case 2:
                print();  //3. Просмотр содержимого базы данных.
                getch();
                break;
            case 3:
                break;
            default:
                printf("\nНеверно указан номер пункта меню!\n");
                getch();
        }
    } while (a!=3);
    pop(h);
}
PS pop - странное название для функции. Обычно pop - это извлечение из некоего стека, а у вас освобождение памяти.
2xep
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 12
24.06.2011, 08:55  [ТС]     исправить двусвязный список? #5
Выводит "нарушение прав доступа", видимо адресса где то перепутаны? я так и не понял где. а насчет оценок, мне надо чтобы вводилось у каждого ученика по 3 оценки. и выводилось столько же
voral
345 / 325 / 46
Регистрация: 16.03.2008
Сообщений: 1,692
24.06.2011, 09:04     исправить двусвязный список? #6
попробуйте clear на cls поменять. Чето меня дернуло. У вас не находит в системе команды clear.
Ну так у вас же оценки водятся за один раз одной строкой.... Или нет?
2xep
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 12
24.06.2011, 09:56  [ТС]     исправить двусвязный список? #7
комманду то я поменял сразу. дело не в этом, при попытке вывести список он выдает ошибку памяти. а оценки примерно так хочу вывести :
....................................................... ученик группа оценки
........................................................... s ..........1..............1
....................................................................................... 2
........................................................................................3

Добавлено через 43 минуты
совсем забыл, вывод как можно осуществить? чтоб и сначала и с конца вывести можно было ?
2xep
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 12
29.06.2011, 00:42  [ТС]     исправить двусвязный список? #8
...ап
voral
345 / 325 / 46
Регистрация: 16.03.2008
Сообщений: 1,692
29.06.2011, 01:08     исправить двусвязный список? #9
я чтоб попробовать закоментил лишнее (уж сам откроешь что нужно), вот как то так. Вводить надо всегда по три оценки через запятую. Можно переделать и под любое колическтов (будет красивее)
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
//#include "stdafx.h"
//#include "conio.h"
#include <stdio.h>
#include <locale.h>
//#include "string.h" // для strcmp();
//#include <ctype.h>
//#include <stdlib.h>
struct student
{
        char name[20];
        int group;
        int ocenki[3];
        struct student *prior; //Указатель на предыдущий элемент:
        struct student *next;  //Указатель на следущий элемент:
 
};
struct student *h, *last;
 
void pop(student* b)
{
    student* tmp=NULL;
    while(h!=NULL)
    {
        tmp=h->next;
        delete h;
        h=tmp;
    }
}
void input()
{
        struct student *ptr;
        ptr=new(student);
        printf("Введите имя студента: ");
        scanf("%s", &ptr->name);
        printf("Введите его группу: ") ;
        scanf("%d", &ptr->group);
        printf("Введите его оценки (3 оценки через запятую): ");
        scanf("%d,%d,%d", &ptr->ocenki[0], &ptr->ocenki[1], &ptr->ocenki[2]);
        //заполняем полученые данные
        if (h==NULL)
            h=ptr;
        else
        {
            ptr->prior=last;
            last->next=ptr;
        };
        last=ptr;
}
void print(int flag)
{
    student* tmp=h;
    if (h==NULL) printf("База пуста");
    else
    {
        printf( "____________________________________________\n"
                "| № |   cтудент  |   группа    |  оценки   |\n"
                "--------------------------------------------\n");
        int j;
        for (tmp=(flag) ? last: h,j=1;tmp!=NULL;tmp=(flag) ? tmp->prior : tmp->next,j++)
        {
            printf("| %d |  %20s |  %d | %2d |\n",j,tmp->name,tmp->group,tmp->ocenki[0]);
            printf("|                                  %2d |\n",tmp->ocenki[1]);
            printf("|                                  %2d |\n",tmp->ocenki[2]);
        }
    }
}
int main(int argc, char** argv)
{
    int a;//номер работы из меню
    setlocale(LC_ALL, "Russian");
//Вывод меню на экран
    do {
//        system("clear");
        printf("            \"заявки\"        \n"
                "                МЕНЮ                  \n"
                "1. Ввод сведений о новом студенте.\n"
                "2. Просмотр всех студентов\n"
                "3. Окончание работы.\n");
//Ввод и обработка номера пункта меню
        printf("\n\nВведите номер пункта меню: ");
        scanf("%d", &a);
//        system("clear");
        switch(a)
        {
            case 1:
                input();  //1. Ввод сведений о новом студенте.
                break;
            case 2:
                print(0);  //3. Просмотр содержимого базы данных.
                print(1);  //3. Просмотр содержимого базы данных.
//                getch();
                break;
            case 3:
                break;
            default:
                printf("\nНеверно указан номер пункта меню!\n");
//                getch();
        }
    } while (a!=3);
    pop(h);
}
Добавлено через 1 минуту
print(0) в прямом порядке print(1) в обратном, но номера строки всегда о возрастанию
2xep
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 12
29.06.2011, 01:21  [ТС]     исправить двусвязный список? #10
нарушение прав доступа в этой строчке
C++
1
  printf("| %d |  %20s |  %d | %2d |\n",j,tmp->name,tmp->group,tmp->ocenki[0]);
и еще.Не мог бы ты мне обьяснить цикл фор этот ,пожалуйста.
C++
1
for (tmp=(flag) ? last: h,j=1;tmp!=NULL;tmp=(flag) ? tmp->prior : tmp->next,j++)
нам не обьяснили их толком , не могу воткнуть параметры этого цикла в голову себе)
voral
345 / 325 / 46
Регистрация: 16.03.2008
Сообщений: 1,692
29.06.2011, 01:38     исправить двусвязный список? #11
1. Мозг уже не совсем работает - не вижу причин
2. в скобках закючена вся "настройка" цикла. Состоит из трех частей.
2.1 инциализация переменных. С такими значениями эпеременные войдут в блок цикла. в данном случае инициализируются две переменные:
j=1 - это мы будем считать номер строки
tmp. тут анализируем если переданный пааметр 1 то присваиваем last (т.е. указатель на последний элемент списка) иначе h - первый элемент списка. переменные разделены запятой.
2.2 Условие выполнения блока цикла. в нашем случае цикл продолжаем в том случае если указатель tmp не равен NULL/
2.3 правило изменения переменных, так же разные переменные разделяются запятой.
j просто увеличиваем на единицу; tmp анализируем входной параметр ф-ии. Если передали 1. то tmp приравниваем указателю на предыдущий элемент, иначе на следующий
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.06.2011, 01:42     исправить двусвязный список?
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
2xep
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 12
29.06.2011, 01:42  [ТС]     исправить двусвязный список? #12
спасибо. но мозг тоже уже в ауте. завтра перечитаю. на свежую голову)
Yandex
Объявления
29.06.2011, 01:42     исправить двусвязный список?
Ответ Создать тему
Опции темы

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