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

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

Войти
Регистрация
Восстановить пароль
 
staket
0 / 0 / 0
Регистрация: 11.11.2011
Сообщений: 4
#1

Построить список - C++

14.11.2011, 19:31. Просмотров 369. Ответов 3
Метки нет (Все метки)

Дано задание
Построить список , исключить первые и n элементы , расположенные после
1. первого отрицательного
2. после наибольшего

Добавлено через 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
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
#include<iostream.h>
#include<conio.h>
 
struct node {
    int info;
    node *next, *prev;
    };
 
void add_L(node*&first, node*&last, int x) {
    node*p = new node;
    p->info = x;
    p->prev = 0;
    p->next = first;
    if(first == 0) last = 0;
        else first->prev = p;
    first = p;
    }
 
void add_R(node*&first, node*&last, int x) {
    node*p = new node;
    p->info = x;
    p->next = 0;
    p->prev = last;
    if(last) last->next = p;
        else first = p;
    last = p;
    }
 
void make(node*&first, node*&last) {
    first = 0;
    last = 0;
    int x;
    do {
        cout<<"\n VVesti nomer: \n";
        cin>>x;
        add_R(first, last, x);
        cout<<"\n Continue ? Y/N \n";
        //cout<<"\nFirst: "<<first<<"\nLast: "<<last;
        } while(getch()!='n');
    }
 
void output(node*first, char t[]) {
    if(first == 0) cout<<"\n List empty \n";
        else {
            node*p = first;
            cout<<t;
            while(p) {
                cout<<p->info<<"  ";
                p = p->next;
                }
            cout<<endl;
            }
    }
 
void insert(node*&last, node*p, int x) {
    node*t = new node;
    t->info = x;
    t->next = p->next;
    t->prev = p;
    if(p == last) last = t;
        else p->next->prev = t;
        p->next = t;
    }
 
void remove(node*&first, node*&last, int &x, node*p) {
    if(p == first) first = p->next;
        else p->prev->next = p->next;
    if(p == last) last = p->prev;
        else p->next->prev = p->prev;
    x = p->info;
    delete p;
    }
void sort(node*first, node*last) {
    node*p = first, *t, *pmin;
    while(p != last) {
        pmin = p;
        t = p->next;
        while(t) {
            if(t->info < pmin->info) pmin = t;
            t = t->next;
            }
        int z = p->info;
        p->info = pmin->info;
        pmin->info = z;
        p = p->next;
        }
    }
 
void main() {
    clrscr();
    int x, z, sum = 0;
    node*first, *last, *p, *a;
    make(first, last);
    output(first, "\n Spisok: \n");
    //Delete 1 pozitive
    p = first;
    while (p!=0&&p->info<0){
    p=p->next;
    }
    if(p==0) cout<<"\n Net polzitelnih \n";
        else{ remove (first, last, x, p);
        sum = sum + x;
        output(first,"\n Spisok posle udaleniya 1  polozitelnogo \n");
        }
    //Add novogo elementa posle min
    p = first;
    a = first;
    z = p->info;
    while(p!=0) {
        p = p->next;
        if(z>p->info) {
            z = p->info;
            a = p;
            }
    }
    cout<<"\n Novii Element ";
    cin>>x;
    insert(last, a, x);
    output(first,"\n Spisok posle dobavlenya\n");
 
    //Udalenie vseh polozitelnih
    p = first;
    while(p!=0) {
        if(p->info>0) {
            remove(first, last, x, p);
            sum = sum + x;
            p = p->prev;
            }
        p = p->next;
    }
    output(first,"\n Spisok posle udaleniya vseh polozitel'nih\n");
 
    sort(first,last);
    output(first,"\n Spisok posle sortirovki\n");
 
    getch();
    }
Добавлено через 3 часа 56 минут
Пожалуйста проверьте кто понимает - чувствую что я не удовлетворил условию задачи ! покажите , где это может быть и как исправить!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.11.2011, 19:31     Построить список
Посмотрите здесь:

Построить односвязный список из входных последовательностей натуральный чисел C++
C++ Построить в динамической памяти линейный связанный список вещественного типа
Связный список (Используя структуру описания даты, построить связный список студентов, сформированный в алфавитном порядке) C++
C++ Построить в динамической памяти линейный связанный список строкового типа данных
Построить связной список C++
C++ Построить линейный список из нескольких динамических переменных
Построить однонаправленный список из элементов файла C++
C++ Построить односвязный список из входной последовательности чисел
C++ Построить двусвязный список сведений о высших учебных заведениях
C++ Построить двусвязный список из данного
Построить линейный список из входной последовательности чисел и перестроить его C++
C++ Построить новый список L3, включив в него элементы, которые входят одновременно в L1 и в L2

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alkagolik
Заблокирован
14.11.2011, 22:31     Построить список #2
staket, может перед первым отрицательным и после наибольшего? или на выбор?
staket
0 / 0 / 0
Регистрация: 11.11.2011
Сообщений: 4
14.11.2011, 22:48  [ТС]     Построить список #3
Там два задания:
1.удалить ячейку после максимального
2.удалить ячейку после первого отрицательного


Мне бы просто понять
кукую функцию ввести в прогу , чтоб она сделал это. ТАк как подумав , что моя реализация удаления первой положительной ячейки после отрицательного никак не подходит к заданию, НИПАНЯТНО

void main() {
clrscr();
int x, z, sum = 0;
node*first, *last, *p, *a;
make(first, last);
output(first, "\n Spisok: \n");
//Delete 1 pozitive
p = first;
while (p!=0&&p->info<0){
p=p->next;
}
if(p==0) cout<<"\n Net polzitelnih \n";
else{ remove (first, last, x, p);
sum = sum + x;
output(first,"\n Spisok posle udaleniya 1 polozitelnogo \n");
}

Добавлено через 1 минуту
если можно в проге это просто показать ! ОТДЕЛЬНЫМ ЦВЕТОВ (например фиолетовым - что понятно было что за функция и зачем она). Ну 1я и 2я

Добавлено через 10 минут
П.С. Помогите Плиз - необходимо как обычно еще вчера , а я так и не допетрил((
alkagolik
Заблокирован
15.11.2011, 13:30     Построить список #4
вот почти готовая программа. надо добавить функцию удаления элемента после отрицательного, по желанию сделать инициализацию stdin и обработать исключение "если список пустой"
код программы
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
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
typedef struct node
{
    int x;
    struct node *next;
};
 
struct node *create_list()
{
    struct node *tmp;
 
    tmp = (struct node*) malloc (sizeof(struct node));
    if (!tmp )
        exit ( -1 );
 
    tmp->x = rand() % 100 - 50;
    tmp->next = 0;
 
    return tmp;
}
 
void add_elements(struct node *pcurrent, int n)
{
    struct node *tmp;
 
    while (n--)
    {
        tmp = (struct node*) malloc(sizeof(struct node));
        if ( !tmp )
            exit ( -1 );
        tmp->x = rand() % 100 - 50;
        pcurrent->next = tmp;
        pcurrent = pcurrent->next;
    }
    pcurrent->next = 0;
}
 
void free_list(struct node *phead)
{
    struct node *tmp = phead, *current = phead;
 
    while (current)
    {
        tmp = current;
        current = current->next;
        free(tmp);
    }
}
 
void print_list(struct node *pcurrent, struct node *phead)
{
    pcurrent = phead;
 
    while(pcurrent)
    {
        printf("%d ", pcurrent->x);
        pcurrent = pcurrent->next;
    }
}
 
struct node *findandel_max(struct node *pcurrent, struct node *phead)
{
    struct node *tmp;
    int max = -1000;
    pcurrent = phead;
 
    while(pcurrent)
    {
        if ( max < (pcurrent->x) )
            max = pcurrent->x;
        pcurrent = pcurrent->next;
    }
 
    pcurrent = phead;
    while ( (pcurrent->x) != max )
        pcurrent = pcurrent->next;
 
    if (pcurrent == phead)
    {
        phead = pcurrent->next;
        free(pcurrent);
    }
    else if ((pcurrent->next) == 0)
        puts("максимальный элемент списка последний в списке");
    else
    {
        tmp = (pcurrent->next)->next;
        free(pcurrent->next);
        pcurrent->next = tmp;
    }
 
    return phead;
}
 
int main()
{
    struct node *head, *current;
    srand(time(0));
 
    head = create_list();
    current = head;
    add_elements(current, 15);
    print_list(current, head);
    puts("");
    head = findandel_max(current, head);
    print_list(current, head);
    
    free_list(head);
    return 0;
}
Yandex
Объявления
15.11.2011, 13:30     Построить список
Ответ Создать тему
Опции темы

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