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

Динамические Списки!!!! Очень нужно...! - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Дан массив из 9 целых чисел. Найти сумму элементов массива и, если она четная, вывести сообщение "Сумма четная", в противном случае напечатать "Сумма http://www.cyberforum.ru/cpp-beginners/thread150938.html
Дан массив из 9 целых чисел. Найти сумму элементов массива и, если она четная, вывести сообщение "Сумма четная", в противном случае напечатать "Сумма нечетная". Операции с элементами массива...
C++ Числа-близнецы 1)Дано натуральное число n. Выяснить, имеются ли среди чисел n, n+1, ..., 2n близнецы, т.е. простые числа , разность между которыми равна двум. (Определить процедуру, позволяющую распознавать простые... http://www.cyberforum.ru/cpp-beginners/thread150931.html
C++ Вопрос про чтение из файла
Дали в колледже курсовую на тему создания ежедневного, почасового расписания(запись дел в определенное время) для 5 бригад. Задание сделал там же в аудитории, на что преподаватель усложнил, мол все...
Найти первые k C++
Найти первые k членов последовательности, если последовательность образована по закону:A1=x , An=...
C++ Отформатировать текст по правому краю http://www.cyberforum.ru/cpp-beginners/thread150923.html
Помогите с программой, не понимаю как это сделать: Разработать программу, которая разбивает заданный текст на две колонки и форматирует их по правому краю (без переноса). Ширина колонки задается...
C++ Детектировать ошибку #include <iostream> #include <windows.h> #include <ddk\ntapi.h> #include <ddk\winddk.h> #include <ddk\ntddk.h> using namespace std; int main() { подробнее

Показать сообщение отдельно
easybudda
Модератор
Эксперт CЭксперт С++
9698 / 5648 / 964
Регистрация: 25.07.2009
Сообщений: 10,863
12.07.2010, 19:23
Цитата Сообщение от Den UA Посмотреть сообщение
Скорей всего не дека а списка!
Вот и я так и не придумал, куда там двухстороннюю очередь прилепить... Вот со списками:
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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
 
typedef struct WRD {
    char * text;
    struct WRD * next;
} wrd_t;
 
typedef struct CHARCOUNT {
    char ch;
    int cnt;
    struct CHARCOUNT * next;
} charcount_t;
 
wrd_t * new_word(const char * s, wrd_t * last){
    wrd_t * w;
    if ( ( w = (wrd_t*)malloc(sizeof(wrd_t)) ) == NULL )
        return NULL;
    if ( ( w->text = strdup(s) ) == NULL ){
        free(w);
        return NULL;
    }
    w->next = NULL;
    if ( last )
        last->next = w;
    return w;
}
 
void clear_words(wrd_t * w){
    wrd_t * t;
    while ( w ){
        t = w->next;
        free(w->text);
        free(w);
        w = t;
    }
}
 
wrd_t * words_list(const char * string, const char * delim){
    char * buf, * p;
    wrd_t * first, * last;
 
    first = last = NULL;
    if ( ( buf = strdup(string) ) == NULL ){
        fprintf(stderr, "Memory error!\n");
        return NULL;
    }
    for ( p = strtok(buf, delim); p != NULL; p = strtok(NULL, delim) ){
        if ( ( last = new_word(p, last) ) == NULL ){
            fprintf(stderr, "Can't add word to list!\n");
            if ( first )
                clear_words(first);
            free(buf);
            return NULL;
        }
        if ( ! first )
            first = last;
    }
    free(buf);
    return first;
}
 
charcount_t * new_counter(const wrd_t * w, charcount_t * last){
    charcount_t * chcnt;
    if ( ( chcnt = (charcount_t*)malloc(sizeof(charcount_t)) ) == NULL )
        return NULL;
    chcnt->ch = toupper(*(w->text));
    chcnt->cnt = 1;
    chcnt->next = NULL;
    if ( last )
        last->next = chcnt;
    return chcnt;
}
 
void clear_counters(charcount_t * chcnt){
    charcount_t * tmp;
    while ( chcnt ){
        tmp = chcnt->next;
        free(chcnt);
        chcnt = tmp;
    }
}
 
charcount_t * get_counter(const charcount_t * counters, const wrd_t * w){
    char ch = toupper(*(w->text));
    while ( counters ){
        if ( counters->ch == ch )
            break;
        counters = counters->next;
    }
    return (charcount_t*)counters;
}
 
charcount_t * create_counters(const wrd_t * words){
    charcount_t * first, * last, * found;
 
    first = last = NULL;
    while ( words ){
        if ( ( found = get_counter(first, words) ) == NULL ){
            if ( ( last = new_counter(words, last) ) == NULL ){
                fprintf(stderr, "Can't create new counter!\n");
                if ( first )
                    clear_counters(first);
                return NULL;
            }
            if ( ! first )
                first = last;
        }
        else
            found->cnt += 1;
        words = words->next;
    }
    return first;
}
 
charcount_t * first_counter(const charcount_t * cntrs){
    const charcount_t * first = cntrs;
    while ( cntrs = cntrs->next )
        if ( cntrs->ch < first->ch )
            first = cntrs;
    return (charcount_t*)first;
}
 
void swap_counters(charcount_t * a, charcount_t * b){
    charcount_t tmp;
    tmp.ch = a->ch;
    tmp.cnt = a->cnt;
    a->ch = b->ch;
    a->cnt = b->cnt;
    b->ch = tmp.ch;
    b->cnt = tmp.cnt;
}
 
void sort_counters(charcount_t * cntrs){
    charcount_t * first;
    while ( cntrs->next ){
        if ( ( first = first_counter(cntrs) ) != cntrs )
            swap_counters(first, cntrs);
        cntrs = cntrs->next;
    }
}
 
void print_counters(const charcount_t * cntrs){
    printf("Character      Words started\n");
    while ( cntrs ){
        printf("'%c'            %d\n", cntrs->ch, cntrs->cnt);
        cntrs = cntrs->next;
    }
}
 
#define DELIM " ,.!?\t\n"
 
int main(void){
    char buf[BUFSIZ];
    wrd_t * words;
    charcount_t * counters;
 
    printf("String: ");
    if ( ! fgets(buf, BUFSIZ, stdin) ){
        fprintf(stderr, "Can't get some string!\n");
        exit(EXIT_FAILURE);
    }
    if ( ( words = words_list(buf, DELIM) ) == NULL ){
        fprintf(stderr, "Can't create list of words!\n");
        exit(EXIT_FAILURE);
    }
    if ( ( counters = create_counters(words) ) == NULL ){
        fprintf(stderr, "Can't create counters!\n");
        clear_words(words);
        exit(EXIT_FAILURE);
    }
    sort_counters(counters);
    print_counters(counters);
 
    clear_words(words);
    clear_counters(counters);
    exit(EXIT_SUCCESS);
}
Можно было чуть проще сделать, но так интереснее...


Цитата Сообщение от Nyto4ka Посмотреть сообщение
вроде бы все понятно...
может тогда и мне объясните...
C
1
2
3
4
5
6
7
8
9
10
11
12
13
...
node_t * add_abs(node_t * n){
        node_t * a;
        while ( n ){
                if ( n->val < 0 ){
                        if ( insert_after(n, n->val * -1) )
                                break;
                }
                n = n->next;
        }
        return n;
}
...
node_t * a; с какой целью объявлена?
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.