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

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

Восстановить пароль Регистрация
 
KBAC
1 / 1 / 0
Регистрация: 10.05.2010
Сообщений: 72
21.10.2010, 00:41     Как осуществить сортировку вставками в списках? #1
Необходимо отсортировать список по алфавиту, помогите пожалуйста.

Добавлено через 1 час 23 минуты
методом: из списка в массив и обратно меня чето не прикалоло сортировать
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
21.10.2010, 02:39     Как осуществить сортировку вставками в списках? #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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
typedef struct STR {
    char * text;
    struct STR * next;
} str_t;
 
str_t * new_str(const char * buf){
    str_t * st;
 
    if ( ( st = (str_t *)malloc(sizeof(str_t)) ) == NULL )
        return NULL;
    if ( ( st->text = strdup(buf) ) == NULL ){
        free(st);
        return NULL;
    }
    st->next = NULL;
    
    return st;
}
 
str_t * del_str(str_t * st){
    str_t * ret = st->next;
    free(st->text);
    free(st);
    return ret;
}
 
typedef struct {
    str_t * first;
    str_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_str(list_t * list, const char * buf){
    str_t * st;
    
    if ( ( st = new_str(buf) ) == NULL )
        return -1;
    if ( ! list->first )
        list->first = st;
    else 
        list->last->next = st;
    list->last = st;
    
    return 0;
}
 
void del_list(list_t * list){
    while ( list->first = del_str(list->first) )
        ;
    free(list);
}
 
void swap_strings(char ** a, char ** b){
    char * tmp = *a;
    *a = *b;
    *b = tmp;
}
 
str_t * min_str(str_t * start){
    str_t * cur, * min;
    
    min = start;
    for ( cur = start->next; cur; cur = cur->next )
        if ( strcmp(cur->text, min->text) < 0 )
            min = cur;
    return min;
}
 
void sort_list(list_t * list){
    str_t * st, * min;
    for ( st = list->first; st->next; st = st->next )
        if ( ( min = min_str(st) ) != st )
            swap_strings(&st->text, &min->text);
}
 
void print_list(const list_t * list){
    const str_t * st;
    for ( st = list->first; st; st = st->next )
        printf("%s\n", st->text);
}
 
int empty_list(list_t * list){
    return list->first == NULL;
}
 
int main(void){
    char buf[BUFSIZ], * p;
    list_t * list;
    
    if ( ( list = new_list() ) == NULL ){
        fprintf(stderr, "Can't create a new list!\n");
        exit(1);
    }
    
    printf("Enter some strings (empty - finish):\n");
    while ( printf("> ") && fgets(buf, BUFSIZ, stdin) ){
        if ( p = strrchr(buf, '\n') )
            *p = '\0';
        if ( ! *buf )
            break;
        if ( push_str(list, buf) ){
            fprintf(stderr, "Can't add string to list!\n");
            del_list(list);
            exit(1);
        }
    }
    
    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);
}
KBAC
1 / 1 / 0
Регистрация: 10.05.2010
Сообщений: 72
21.10.2010, 15:16  [ТС]     Как осуществить сортировку вставками в списках? #3
спасибо, буду разбираться

Добавлено через 2 часа 14 минут
чет я не подумал просто поля с фамилиями заменять..
кстати, почему в вашей проге работает ввод/вывод на русском языке ?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
21.10.2010, 15:29     Как осуществить сортировку вставками в списках? #4
Цитата Сообщение от KBAC Посмотреть сообщение
чет я не подумал просто поля с фамилиями заменять..
вообще-то, если структура содержит статические массивы (типа char name[BUFSIZ]) лучше создавать двусвязный список и менять указатели на элементы, а не содержимое массивов. У меня в структуре находится указатель на строку, поэтому проще так, как сделал...

Цитата Сообщение от KBAC Посмотреть сообщение
почему в вашей проге работает ввод/вывод на русском языке ?
а не должен бы?
KBAC
1 / 1 / 0
Регистрация: 10.05.2010
Сообщений: 72
21.10.2010, 15:56  [ТС]     Как осуществить сортировку вставками в списках? #5
Цитата Сообщение от easybudda Посмотреть сообщение
а не должен бы?
там ведь не стоит никаких setlocale, SetConsoleCP(1251), SetConsoleOutputCP(1251)О_о
IchMors
96 / 92 / 4
Регистрация: 16.05.2010
Сообщений: 307
21.10.2010, 16:03     Как осуществить сортировку вставками в списках? #6
Вот мне просто интересно, а вот так не катит?
C++
1
2
3
4
5
6
7
8
9
int main()
{
    string mass = "faslkvg";
    cout << mass;
    cout <<endl;
    sort(mass.begin(), mass.end());
 
    cout << mass;
}
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
21.10.2010, 16:11     Как осуществить сортировку вставками в списках? #7
IchMors, нужно не буквы в слове сортировать, а слова в списке.
IchMors
21.10.2010, 16:12
  #8

Не по теме:

аааа, ферштейн...

KBAC
1 / 1 / 0
Регистрация: 10.05.2010
Сообщений: 72
21.10.2010, 16:14  [ТС]     Как осуществить сортировку вставками в списках? #9
IchMors, я так понял эта функция для базовых классов данных, не для списков структур, тем она и не подходит, что ей не отсортируешь по фамилиям.

easybudda, ваш способ наверно все таки будет не очень крутым для сортировки таких структур
C++
1
2
3
4
5
6
7
8
struct WORKER {
        char familiya[15];
    char imya[15];
    char ot4estvo[15];
        char dolzhnost[25];
        int stage;
    WORKER* next;
} ;
надо создавать будет структуру tmp без поля некст и др. заморочки.. может, тут лучше будет ввести еще одно поле для указателей, которым я буду присваивать уже адреса в порядке алфавита?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
21.10.2010, 17:04     Как осуществить сортировку вставками в списках? #10
Цитата Сообщение от 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);
}
проверкой вводимых данных и красивостью вывода особо не заморачивался - нам же важнее, чтобы список по фамилиям сортировался
Всё ещё работает с русскими буквами
IchMors
96 / 92 / 4
Регистрация: 16.05.2010
Сообщений: 307
21.10.2010, 17:06     Как осуществить сортировку вставками в списках? #11
Опять таки может я ошибаюсь, но:
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
#include <conio.h>
#include <iostream.h>
#include <string.h>
#include <vector>
#include <algorithm>
#include <functional>
 
using namespace std;
 
struct WORKER {
        char familiya[15];
        char imya[15];
        char ot4estvo[15];
        char dolzhnost[25];
        int stage;
        WORKER* next;
} ;
 
struct func//определение сортировки
{
  bool operator()(WORKER a, WORKER b)
  { return strcmp(a.familiya,b.familiya) < 0; }
};
 
void out(WORKER a)//вывод
{
    cout << "familiya: ";
    puts(a.familiya);
    cout << "imya: ";
    puts(a.imya);
    cout << "ot4estvo: ";
    puts(a.ot4estvo);
    cout << "dolzhnost: ";
    puts(a.dolzhnost);
    cout << "stage: ";
    cout << a.stage << endl;
}
 
int main()
{   
    vector <WORKER> departament(3);
    func f;
 
//как то там заполняем
    strcpy(departament[0].familiya, "Petrov");
    strcpy(departament[1].familiya, "Zero");
    strcpy(departament[2].familiya, "Sidorov");
//собсна сортировка
    sort(departament.begin(), departament.end(), f);
 
    for(int i = 0; i< departament.size();i++)
        out(departament[i]);
    
    _getch();
//  cin.ignore();
    return 0;
}
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
21.10.2010, 17:22     Как осуществить сортировку вставками в списках? #12
Цитата Сообщение от IchMors Посмотреть сообщение
Опять таки может я ошибаюсь, но:
Цитата Сообщение от IchMors Посмотреть сообщение
vector <WORKER> departament(3);
оно же массив, а не список! при таком подходе
Цитата Сообщение от IchMors Посмотреть сообщение
WORKER* next;
нафиг не нужно

да и цель всей этой свистопляски, скорее всего - научиться руками списки делать...
IchMors
96 / 92 / 4
Регистрация: 16.05.2010
Сообщений: 307
21.10.2010, 18:04     Как осуществить сортировку вставками в списках? #13
да, согласен...
Цитата Сообщение от easybudda Посмотреть сообщение
и цель всей этой свистопляски, скорее всего - научиться руками списки делать...
вот KBAC, и делает ручками
KBAC
1 / 1 / 0
Регистрация: 10.05.2010
Сообщений: 72
22.10.2010, 11:38  [ТС]     Как осуществить сортировку вставками в списках? #14
вобщем, попробовал перелопатить на свой лад, вот что получилось :
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
#include<iostream>
#include<string.h>
#include<ctype.h>
#include<Windows.h>
#include<stdlib.h>
#include<fstream>
 
using namespace std;
 
char fname[] = "e:\\Workers.txt";
 
struct WORKER {
        char familiya[15];
    char imya[15];
    char ot4estvo[15];
        char dolzhnost[25];
        int stage;
    WORKER* next;
} ;
 
typedef char* pch;
typedef WORKER* pw;
 
void WORKER_add(pw &head,ifstream &fin)
{
    if (head==NULL)
    {
        head=new WORKER;
        head->next=NULL;
        fin >> head->familiya;
        fin >> head->imya;
        fin >> head->ot4estvo;
        fin >> head->dolzhnost;
        fin >> head->stage;
    }
    else 
    {
        pw p;
        p=head;
        while (p->next!=NULL)
            p=p->next;
        p->next=new WORKER;
        p->next->next=NULL;
        fin >> p->next->familiya;
        fin >> p->next->imya;
        fin >> p->next->ot4estvo;
        fin >> p->next->dolzhnost;
        fin >> p->next->stage;
    }
}
pw input_data(pw &head)
{
    ifstream fin;
    fin.open(fname);
    if (!fin)
    {
             cout<<"\aОткрытие файла не удалось! Попытайтесь снова!";
             return head;
    }
    else    
    {
        while(!fin.eof())
                WORKER_add(head,fin);
        fin.close();
     }
     return head;
}
pw min_fam(pw start)
{
    pw p,min;
    min=start;
    for(p=start;p;p=p->next)
        if(strcmp(p->familiya, min->familiya) < 0)
            min=p;
    return min;
}
struct _tmp{
    char familiya[15];
    char imya[15];
    char ot4estvo[15];
    char dolzhnost[25];
    int stage;
};
void exchange(pw &p,pw &min)
{
    _tmp A;
    A.dolzhnost=p->dolzhnost;
    A.familiya=p->familiya;
    A.imya=p->imya;
    A.ot4estvo=p->ot4estvo;
    A.stage=p->stage;
    p->dolzhnost=min->dolzhnost;
    p->familiya=min->familiya;
    p->imya=min->imya;
    p->ot4estvo=min->ot4estvo;
    p->stage=min->stage;
    min->dolzhnost=A.dolzhnost;
    min->familiya=A.familiya;
    min->imya=A.imya;
    min->ot4estvo=A.ot4estvo;
    min->stage=A.stage;
}
pw sort(pw &head)
{
    pw p,min;
    p=head;
    for(p;p->next;p=p->next)
        if(min=min_fam(p)!=p)
            exchange(p,min);
    return head;
}
 
int main()
{ 
        SetConsoleCP(1251); 
        SetConsoleOutputCP(1251);
 
        pw head=NULL;
                head=input_data(head);
        head=sort(head);
        pw p =head;
        cout<<"База работников:\n";
        while (p!=NULL)
        {
            cout<<p->familiya<<' '<<p->imya<<' '<<p->ot4estvo<<endl;
            p=p->next;
        }
        
        return 0;
}
да, еще проблема что не компилируется не пойму, его не устраивает(Великого Компилятора) левые операнды в exchange'е.

Добавлено через 16 часов 16 минут
Помогите пожалуйста!
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
22.10.2010, 13:26     Как осуществить сортировку вставками в списках? #15
Цитата Сообщение от KBAC Посмотреть сообщение
Помогите пожалуйста!
А чем моя-то програмка не устроила? Работает же... При чём сортировку должна делать достаточно быстро за счёт того, что меняются только значения указателей, а данные не перемещаются...
KBAC
1 / 1 / 0
Регистрация: 10.05.2010
Сообщений: 72
29.10.2010, 19:43  [ТС]     Как осуществить сортировку вставками в списках? #16
у меня несколько тут вопрос созрел easybudda, почему вы организовываете списки через дополнительные структуры, почему не сделать внутри одной структуры указатель на следующий элемент и все ?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
29.10.2010, 22:38     Как осуществить сортировку вставками в списках? #17
Цитата Сообщение от KBAC Посмотреть сообщение
почему вы организовываете списки через дополнительные структуры, почему не сделать внутри одной структуры указатель на следующий элемент и все ?
Да можно по-разному сделать, но мне такой подход больше нравится - каждая програмная единица должна свою задачу решать. По сути есть класс данных, класс - элемент списка и класс - список. Тот факт, что язык С не поддерживает классы, в принципе не значит, что основные идеи ООП в программах на С нельзя использовать. В конечном счёте так просто удобнее.
KBAC
1 / 1 / 0
Регистрация: 10.05.2010
Сообщений: 72
29.10.2010, 23:52  [ТС]     Как осуществить сортировку вставками в списках? #18
помогите разобраться еще с такой проблемой: когда в конце программы использую del_list, первый вызов происходит гладко, все зачищает, а вот когда второй список удалять, получается что указатели уже стерты и выдает ошибку, как можно справиться с этим?
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
#include<iostream>
#include<Windows.h>
#include<fstream>
 
using namespace std;
 
char fname[] = "e:\\Workers.txt";
 
struct WORKER {
        char familiya[15];
        char imya[15];
        char ot4estvo[15];
        char dolzhnost[25];
        int stage;
} ;
typedef struct WORKER_HOLDER{
    WORKER* worker;
    WORKER_HOLDER* next;
} whold;
 
void WORKER_scan(whold*& head)
{
    if (head==NULL)
    {
        head=new whold;
        head->worker=new WORKER;
        cout<<"введите фамилию: ";cin>>head->worker->familiya;
        cout<<"введите имя: ";cin>>head->worker->imya;
        cout<<"введите отчество: ";cin>>head->worker->ot4estvo;
        cout<<"введите должность: ";cin>>head->worker->dolzhnost;
        cout<<"введите стаж";cin>>head->worker->stage;
        head->next=NULL;
        return;
    }
    whold* p=head;
    while(p->next!=NULL)
        p=p->next;
    p->next=new whold;
    p->next->worker=new WORKER;
    cout<<"введите фамилию: ";cin>>p->next->worker->familiya;
    cout<<"введите имя: ";cin>>p->next->worker->imya;
    cout<<"введите отчество: ";cin>>p->next->worker->ot4estvo;
    cout<<"введите должность: ";cin>>p->next->worker->dolzhnost;
    cout<<"введите стаж";cin>>p->next->worker->stage;
    p->next->next=NULL;
}
void print_list(whold* head)
{
    whold *p=head;
    while (p!=NULL)
    {
        cout<<p->worker->familiya<<' '<<p->worker->imya<<' '<<p->worker->ot4estvo<<endl;
        p=p->next;
    }
}
whold* search(whold* head)
{
    int st;
    cout<<"введите интересуемый стаж: ";
    cin>>st;
    whold* w=head;
    bool flag=false;
    while(w)
    {
        if (w->worker->stage>st)
        {
            flag=true;
            break;
        }
        w=w->next;
    }
    if(flag)
    {
        whold* list=NULL;
        w=head;
        while(w)
        {
            if ((list==NULL)&&(w->worker->stage>st))
            {
                list=new whold;
                list->worker=new WORKER;
                list->worker=w->worker;
                list->next=NULL;
                break;
            }
            w=w->next;
        }
        whold* l=list;
        w=w->next;
        while (w)
        {
            if(w->worker->stage>st)
            {
                l->next=new whold;
                l->next->worker=new WORKER;
                l->next->worker=w->worker;
                l->next->next=NULL;
                l=l->next;
            }
            w=w->next;
        }
        return list;
    }
    return NULL;
}
void del_list(whold* &head)
{
    whold* p;
    while(head!=NULL)
    {
        p = head;
        head = head->next;
        delete p->worker;
        delete p;
    }
}
int main()
{
    SetConsoleCP(1251); 
    SetConsoleOutputCP(1251);
 
    whold* head=NULL;
    whold* list=NULL;
        char change;
    do 
    {
        cout<<"\nдобавить запись в базу?(y/n)"<<endl;
        cin>>change;
        cout<<endl;
        switch (change) 
        {
            case y: {
                WORKER_scan(head);
                break;
            }
            case n: {
                cout<<"до новых встреч :-)"<<endl;
                break;
            }
        }
    }
    while(change!='n');
 
        list=search(head);
    if(list)
    {
        cout<<"Результат поиска: \n";
        print_list(list);
    }
    else cout<<"Нет ни одного работника с заданным стажем"<<endl;
    
        del_list(list);
    del_list(head);
    return 0;
}
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
30.10.2010, 00:08     Как осуществить сортировку вставками в списках? #19
KBAC, вот по этому так здорово делить задачу на более мелкие...
Во-первых, если я правильно понял,
Цитата Сообщение от KBAC Посмотреть сообщение
whold* search(whold* head)
возвращает указатель на элемент из списка, начинающегося с head? Тогда зачем пытаться уничтожить часть списка, начинающуюся с найденного элемента? Мало того, сам список к этому времени уже удалён предыдущей командой.

Цитата Сообщение от KBAC Посмотреть сообщение
list=search(head);
Даже если и надо было бы удалять то, указатель на что возвращает search (допустим, она бы возвращала указатель на новый список, скопированный с переданного параметром начиная с найденного элемента), когда ничего не найдено, функция NULL возвращает, а Вы его всё равно в del_list отправить пытаетесь...

Добавлено через 2 минуты
Присмотрелся внимательнее - там действительно смута какая-то... чи вернётся указатель, чи ни - как повезёт, короче... И таки там действительно что-то с чего-то зачем-то копируется
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.10.2010, 00:27     Как осуществить сортировку вставками в списках?
Еще ссылки по теме:

Как осуществить проверку даты? C++
Сортировку вставками меняем на сортировку слиянием C++
Сортировку вставками меняем на Пирамидальную сортировку и на Сортировку подсчётом C++

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

Или воспользуйтесь поиском по форуму:
KBAC
1 / 1 / 0
Регистрация: 10.05.2010
Сообщений: 72
30.10.2010, 00:27  [ТС]     Как осуществить сортировку вставками в списках? #20
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
whold* search(whold* head)
{
        int st;
        cout<<"введите интересуемый стаж: ";
        cin>>st;
        whold* w=head;
        bool flag=false;
        while(w)
        {
                if (w->worker->stage>st)
                {
                        flag=true;         //для начала мы определяем есть ли вообще подходящие кадры
                        break;
                }
                w=w->next;
        }
        if(flag)                       //затем если таковые есть, мы создаем абсолютно новый список
        {
                whold* list=NULL;
                w=head;
                while(w)
                {
                        if ((list==NULL)&&(w->worker->stage>st))
                        {
                                list=new whold;
                                list->worker=new WORKER;
                                list->worker=w->worker;
                                list->next=NULL;
                                break;
                        }
                        w=w->next;
                }
                whold* l=list;
                w=w->next;
                while (w)
                {
                        if(w->worker->stage>st)
                        {
                                l->next=new whold;
                                l->next->worker=new WORKER;
                                l->next->worker=w->worker;
                                l->next->next=NULL;
                                l=l->next;
                        }
                        w=w->next;
                }
                return list;                  //и возвращаем указатель на список искомых кадров
        }
        return NULL;  //если не повезло, тогда возвращаем нуль
}
получается что я создаю список с новой последовательностью, но указатели на данные по сути дела одни ... теперь понял че к чему. так получается что просто удалить начальный список , т.е всю базу, будет в принципе достаточно?
а про то что я пытаюсь нуль засунуть в удаление, там же ничего страшного не случается, просто функцию лишний раз вызову. в этом я больше проигрываю чем проверять условие ? ну т.е. если равно нулю то сразу выходить если нет - вызывать .
Yandex
Объявления
30.10.2010, 00:27     Как осуществить сортировку вставками в списках?
Ответ Создать тему
Опции темы

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