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

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

Восстановить пароль Регистрация
 
staket
 Аватар для staket
0 / 0 / 0
Регистрация: 11.11.2011
Сообщений: 4
14.11.2011, 19:31     Построить список #1
Дано задание
Построить список , исключить первые и 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++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
14.11.2011, 22:31     Построить список #2
staket, может перед первым отрицательным и после наибольшего? или на выбор?
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
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
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     Построить список
Ответ Создать тему
Опции темы

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