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

Как осуществить сортировку вставками в списках? - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Напечатать те слова массива, в которых нет повторяющихся букв http://www.cyberforum.ru/cpp-beginners/thread179274.html
Привет! Помогите мне, пожалуйста, написать программу. Задание: Задан массив слов. Напечатать те слова этого массива в которых нет повторяющихся букв. Пишите, пожалуйста, на языке С++. Не дублируйте темы - это нарушение правил форума!
C++ Построение магического квадрата Помогите построить магический квадрат (магическим квадратом n-ого порядка называется квадрат размерами nxn со вписанными в него натуральными числами от 1 до n2 так, что сумма их по всем горизонталям, вертикалям и диагоналям квадрата равна одному и тому же числу.) http://www.cyberforum.ru/cpp-beginners/thread179268.html
последовательность чисел b1,...bn C++
Дана последовательность чисел b1,...bn. Получить квадратную матрицу порядка n, элементами которой являются числа b1,...,bn^n, расположенные по схеме:
C++ Указатели
Нифига не догоняю тему про указатели, есть книга по C/C++ но там не очень понятным языком написано Киньте плиз ссылку на хороший мануал по указателям с нуля, я читал что если не понял эту тему то дальше язык не поймешь?
C++ Возможно ли выводить текст подчеркнутым (зачеркнутым, курсивом)? http://www.cyberforum.ru/cpp-beginners/thread179246.html
Привет всем. Поискал на форуме - не нашел. Скажите пожалуйста, возможно ли выводить текст на экран в с++ подчеркнутым (зачеркнутым, курсивом и тд.)? Задание - отсортировать массив с интерпретацией, для того, чтобы видеть работу сортировщика. Сортировку я сделал, хочу сделать интерпретацию - как-нибудь выделять элементы, которые будут меняться. Как это можно сделать?
C++ Форматированный вывод значения переменной Подскажите пожалуйста как мне вывести значение переменной функцией std::cout чтоб ей отводилось определенное кол-во знаков. Мне необходимо например вывести вот так std::cout <<"== "<<a<<" == "<<x_<<" == "<<y<<" == "<<z<<" ==\n"; чтоб каждой переменной отводилось например по 7 символов? подробнее

Показать сообщение отдельно
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
21.10.2010, 17:04     Как осуществить сортировку вставками в списках?
Цитата Сообщение от KBAC Посмотреть сообщение
ваш способ наверно все таки будет не очень крутым для сортировки таких структур
а это смотря, как делать...
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
typedef struct WORKER {
        char familiya[15];
        char imya[15];
        char ot4estvo[15];
        char dolzhnost[25];
        int stage;
}worker_t;
 
typedef struct WORKER_HOLDER {
    worker_t * worker;
    struct WORKER_HOLDER * next;
} whold_t;
 
whold_t * new_worker(const worker_t * w){
    whold_t * wh;
 
    if ( ( wh = (whold_t *)malloc(sizeof(whold_t)) ) == NULL )
        return NULL;
    if ( ( wh->worker = (worker_t*)malloc(sizeof(worker_t)) ) == NULL ){
        free(wh);
        return NULL;
    }
    memcpy(wh->worker, w, sizeof(worker_t));
    wh->next = NULL;
    
    return wh;
}
 
whold_t * del_worker(whold_t * wh){
    whold_t * ret = wh->next;
    free(wh->worker);
    free(wh);
    return ret;
}
 
typedef struct {
    whold_t * first;
    whold_t * last;
} list_t;
 
list_t * new_list(void){
    list_t * list;
    
    if ( ( list = (list_t *)malloc(sizeof(list_t)) ) == NULL )
        return NULL;
    list->first = NULL;
    list->last = NULL;
    
    return list;
}
 
int push_worker(list_t * list, const worker_t * w){
    whold_t * wh;
    
    if ( ( wh = new_worker(w) ) == NULL )
        return -1;
    if ( ! list->first )
        list->first = wh;
    else 
        list->last->next = wh;
    list->last = wh;
    
    return 0;
}
 
void del_list(list_t * list){
    while ( list->first = del_worker(list->first) )
        ;
    free(list);
}
 
void swap_workers(whold_t * a, whold_t * b){
    worker_t * w = a->worker;
    a->worker = b->worker;
    b->worker = w;
}
 
whold_t * min_fam(whold_t * start){
    whold_t * cur, * min;
    
    min = start;
    for ( cur = start->next; cur; cur = cur->next )
        if ( strcmp(cur->worker->familiya, min->worker->familiya) < 0 )
            min = cur;
    return min;
}
 
void sort_list(list_t * list){
    whold_t * wh, * min;
    for ( wh = list->first; wh->next; wh = wh->next )
        if ( ( min = min_fam(wh) ) != wh )
            swap_workers(wh, min);
}
 
void print_list(const list_t * list){
    const whold_t * wh;
    for ( wh = list->first; wh; wh = wh->next ){
        printf("%s ", wh->worker->familiya);
        printf("%s ", wh->worker->imya);
        printf("%s ", wh->worker->ot4estvo);
        printf("%s ", wh->worker->dolzhnost);
        printf("%d\n", wh->worker->stage);
    }
}
 
int empty_list(list_t * list){
    return list->first == NULL;
}
 
int main(void){
    worker_t worker;
    list_t * list;
    char answ;
    
    if ( ( list = new_list() ) == NULL ){
        fprintf(stderr, "Can't create a new list!\n");
        exit(1);
    }
    
    while ( 1 ){
        printf("Familiya: ");
        scanf("%14[^\n]%*c", &worker.familiya);
        printf("Imya: ");
        scanf("%14[^\n]%*c", &worker.imya);
        printf("Otchestvo: ");
        scanf("%14[^\n]%*c", &worker.ot4estvo);
        printf("Dolzhnost: ");
        scanf("%24[^\n]%*c", &worker.dolzhnost);
        printf("Stage: ");
        scanf("%d%*c", &worker.stage);
 
        if ( push_worker(list, &worker) ){
            fprintf(stderr, "Can't add worker to list!\n");
            del_list(list);
            exit(1);
        }
        printf("\nAdd another? (y/n): ");
        scanf("%c%*c", &answ);
        if ( answ != 'y' && answ != 'Y' )
            break;
    }
    
    if ( empty_list(list) ){
        fprintf(stderr, "List is empty!\n");
        exit(1);
    }
    
    printf("\nSorted ascendant:\n");
    sort_list(list);
    print_list(list);
    
    del_list(list);
    exit(0);
}
проверкой вводимых данных и красивостью вывода особо не заморачивался - нам же важнее, чтобы список по фамилиям сортировался
Всё ещё работает с русскими буквами
 
Текущее время: 01:11. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru