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

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

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

Скип-список - C++

07.10.2013, 10:45. Просмотров 803. Ответов 16
Метки нет (Все метки)

не получается исправить ошибку. Кто знает решение?
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
181
182
183
184
/* skip list */
 
#include <stdio.h>
#include <stdlib.h>
 
/* define data-type and compare operators here */
typedef int T;                  /* type of item to be stored */
#define compLT(a,b) (a < b)
#define compEQ(a,b) (a == b)
 
/* levels range from (0 .. MAXLEVEL) */
#define MAXLEVEL 15
 
typedef struct Node_ {
    T data;                     /* user's data */
    struct Node_ *forward[1];   /* skip list forward pointer */
} Node;
 
typedef struct {
    Node *hdr;                  /* list Header */
    int listLevel;              /* current level of list */
} SkipList;
 
SkipList list;                  /* skip list information */
 
#define NIL list.hdr
 
Node *insertNode(T data) {
    int i, newLevel;
    Node *update[MAXLEVEL+1];
    Node *x;
 
   /***********************************************
    *  allocate node for data and insert in list  *
    ***********************************************/
 
    /* find where data belongs */
    x = list.hdr;
    for (i = list.listLevel; i >= 0; i--) {
        while (x->forward[i] != NIL 
          && compLT(x->forward[i]->data, data))
            x = x->forward[i];
        update[i] = x;
    }
    x = x->forward[0];
    if (x != NIL && compEQ(x->data, data)) return(x);
 
    /* determine level */
    for (newLevel = 0; rand() < RAND_MAX/2 && newLevel < MAXLEVEL; newLevel++);
 
    if (newLevel > list.listLevel) {
        for (i = list.listLevel + 1; i <= newLevel; i++)
            update[i] = NIL;
        list.listLevel = newLevel;
    }
 
    /* make new node */
    if ((x = malloc(sizeof(Node) + 
      newLevel*sizeof(Node *))) == 0) {
        printf ("insufficient memory (insertNode)\n");
        exit(1);
    }
    x->data = data;
 
    /* update forward links */
    for (i = 0; i <= newLevel; i++) {
        x->forward[i] = update[i]->forward[i];
        update[i]->forward[i] = x;
    }
    return(x);
}
 
void deleteNode(T data) {
    int i;
    Node *update[MAXLEVEL+1], *x;
 
   /*******************************************
    *  delete node containing data from list  *
    *******************************************/
 
    /* find where data belongs */
    x = list.hdr;
    for (i = list.listLevel; i >= 0; i--) {
        while (x->forward[i] != NIL 
          && compLT(x->forward[i]->data, data))
            x = x->forward[i];
        update[i] = x;
    }
    x = x->forward[0];
    if (x == NIL || !compEQ(x->data, data)) return;
 
    /* adjust forward pointers */
    for (i = 0; i <= list.listLevel; i++) {
        if (update[i]->forward[i] != x) break;
        update[i]->forward[i] = x->forward[i];
    }
 
    free (x);
 
    /* adjust header level */
    while ((list.listLevel > 0)
    && (list.hdr->forward[list.listLevel] == NIL))
        list.listLevel--;
}
 
Node *findNode(T data) {
    int i;
    Node *x = list.hdr;
 
   /*******************************
    *  find node containing data  *
    *******************************/
 
    for (i = list.listLevel; i >= 0; i--) {
        while (x->forward[i] != NIL 
          && compLT(x->forward[i]->data, data))
            x = x->forward[i];
    }
    x = x->forward[0];
    if (x != NIL && compEQ(x->data, data)) return (x);
    return(0);
}
 
void initList() {
    int i;
 
   /**************************
    *  initialize skip list  *
    **************************/
 
    if ((list.hdr = malloc(sizeof(Node) + MAXLEVEL*sizeof(Node *))) == 0) {
        printf ("insufficient memory (initList)\n");
        exit(1);
    }
    for (i = 0; i <= MAXLEVEL; i++)
        list.hdr->forward[i] = NIL;
    list.listLevel = 0;
}
 
int main(int argc, char **argv) {
    int i, *a, maxnum, random;
 
    /* command-line:
     *
     *   skl maxnum [random]
     *
     *   skl 2000
     *       process 2000 sequential records
     *   skl 4000 r
     *       process 4000 random records
     *
     */
 
    maxnum = atoi(argv[1]);
    random = argc > 2;
 
    initList();
 
    if ((a = malloc(maxnum * sizeof(*a))) == 0) {
        fprintf (stderr, "insufficient memory (a)\n");
        exit(1);
    }
 
    if (random) {
        /* fill "a" with unique random numbers */
        for (i = 0; i < maxnum; i++) a[i] = rand();
        printf ("ran, %d items\n", maxnum);
    } else {
        for (i = 0; i < maxnum; i++) a[i] = i;
        printf ("seq, %d items\n", maxnum);
    }
 
    for (i = 0; i < maxnum; i++) {
        insertNode(a[i]);
    }
 
    for (i = maxnum-1; i >= 0; i--) {
        findNode(a[i]);
    }
 
    for (i = maxnum-1; i >= 0; i--) {
        deleteNode(a[i]);
    }
    return 0;
Ошибка 1 error C2440: =: невозможно преобразовать "void *" в "Node *"
Ошибка 2 error C2440: =: невозможно преобразовать "void *" в "Node *"
Ошибка 3 error C2440: =: невозможно преобразовать "void *" в "int *"
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.10.2013, 10:45     Скип-список
Посмотрите здесь:

Преобразовать список рёбер в список смежностей - C++
помогите преобразовать список рёбер в список смежностей

Односвязный список в список - C++
Всем привет. Гугл мне ответа не дал. Не понимаю, как один список вставить в другой и как передвигаться по нему? В одном списке хранится...

Создать список L2, которые копирует список L1, начиная с выбранного узла - PascalABC.NET
Создать список L2, которые копирует список L1, начиная с выбранного узла. По алгоритму копирования, думаю, вопросов не будет. Мне...

Программа, разворачивающая список типа a-z в полный список abc.xyz - C (СИ)
Буду благодарен, если кто-то объяснит, как работает данная программа построчно (отлично будет, если написать комментарии к каждой строке...

Объекты (массив, список, двунаправленый список), использовать виртуальные методы - Free Pascal
2.Объект!: поле - одномерный массив; методы: основные методы работы с одномерным массивом; найти индекс наименьшего элемента; найти сумму...

Проверка данных (тип список), список возможных вариантов при вводе вручную - MS Excel
Можно ли в инструменте Проверка данных (при типе данных &quot;Список&quot;) выводить список возможных значений при вводе вручную? Например, если...

Дан список, состоящий из названия книг. Напечатать список, упорядоченный по фамилии автора - Visual Basic
Дан список, состоящий из названия книг, фамилии авторов, названия издания и года издания. Напечатать список, упорядоченный по фамилии...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
07.10.2013, 11:17     Скип-список #2
GambLex, Не пытайтесь компилировать код на Си компилятором С++. В конкретном случае, при присвоении void* другому указателю нужно явно указать к какому типу приводится void*.
Для примера

C++
1
a = malloc(maxnum * sizeof(*a))) == 0
Должно быть
C++
1
a = (int*)malloc(maxnum * sizeof(*a))) == 0
GambLex
0 / 0 / 0
Регистрация: 14.10.2012
Сообщений: 58
08.10.2013, 14:51  [ТС]     Скип-список #3
она не запускается!! кто знает причину! может компилятор нужно другой попробовать?? у меня VS 2012
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
08.10.2013, 15:19     Скип-список #4
А ты параметры передаешь ей при запуске? Без параметров она будет вести себя неизвестно как..
GambLex
0 / 0 / 0
Регистрация: 14.10.2012
Сообщений: 58
08.10.2013, 15:42  [ТС]     Скип-список #5
параметры задаю, все равно ....
вообще что-то перестаю понимать эту прогу))
castaway
08.10.2013, 16:13
  #6

Не по теме:

Цитата Сообщение от GambLex Посмотреть сообщение
вообще что-то перестаю понимать эту прогу))
Это логично. Ведь написал её другой человек.

GambLex
0 / 0 / 0
Регистрация: 14.10.2012
Сообщений: 58
08.10.2013, 16:58  [ТС]     Скип-список #7
поэтому и хочу разобраться в ней
castaway
08.10.2013, 17:01
  #8

Не по теме:

Цитата Сообщение от GambLex Посмотреть сообщение
поэтому и хочу разобраться в ней
Она хоть что должна делать то эта программа?

GambLex
0 / 0 / 0
Регистрация: 14.10.2012
Сообщений: 58
08.10.2013, 17:03  [ТС]     Скип-список #9
http://algolist.manual.ru/ds/s_skl.php
tzeentch
25 / 25 / 2
Регистрация: 13.04.2013
Сообщений: 79
08.10.2013, 17:16     Скип-список #10
Компилируется, работает.
Странно только что вывода мало...

Кликните здесь для просмотра всего текста
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
181
182
183
184
185
/* skip list */
 
#include <stdio.h>
#include <stdlib.h>
 
/* define data-type and compare operators here */
typedef int T;                  /* type of item to be stored */
#define compLT(a,b) (a < b)
#define compEQ(a,b) (a == b)
 
/* levels range from (0 .. MAXLEVEL) */
#define MAXLEVEL 15
 
typedef struct Node_ {
    T data;                     /* user's data */
    struct Node_ *forward[1];   /* skip list forward pointer */
} Node;
 
typedef struct {
    Node *hdr;                  /* list Header */
    int listLevel;              /* current level of list */
} SkipList;
 
SkipList list;                  /* skip list information */
 
#define NIL list.hdr
 
Node *insertNode(T data) {
    int i, newLevel;
    Node *update[MAXLEVEL+1];
    Node *x;
 
   /***********************************************
    *  allocate node for data and insert in list  *
    ***********************************************/
 
    /* find where data belongs */
    x = list.hdr;
    for (i = list.listLevel; i >= 0; i--) {
        while (x->forward[i] != NIL
          && compLT(x->forward[i]->data, data))
            x = x->forward[i];
        update[i] = x;
    }
    x = x->forward[0];
    if (x != NIL && compEQ(x->data, data)) return(x);
 
    /* determine level */
    for (newLevel = 0; rand() < RAND_MAX/2 && newLevel < MAXLEVEL; newLevel++);
 
    if (newLevel > list.listLevel) {
        for (i = list.listLevel + 1; i <= newLevel; i++)
            update[i] = NIL;
        list.listLevel = newLevel;
    }
 
    /* make new node */
    if ((x = (Node*)malloc(sizeof(Node) +
      newLevel*sizeof(Node *))) == 0) {
        printf ("insufficient memory (insertNode)\n");
        exit(1);
    }
    x->data = data;
 
    /* update forward links */
    for (i = 0; i <= newLevel; i++) {
        x->forward[i] = update[i]->forward[i];
        update[i]->forward[i] = x;
    }
    return(x);
}
 
void deleteNode(T data) {
    int i;
    Node *update[MAXLEVEL+1], *x;
 
   /*******************************************
    *  delete node containing data from list  *
    *******************************************/
 
    /* find where data belongs */
    x = list.hdr;
    for (i = list.listLevel; i >= 0; i--) {
        while (x->forward[i] != NIL
          && compLT(x->forward[i]->data, data))
            x = x->forward[i];
        update[i] = x;
    }
    x = x->forward[0];
    if (x == NIL || !compEQ(x->data, data)) return;
 
    /* adjust forward pointers */
    for (i = 0; i <= list.listLevel; i++) {
        if (update[i]->forward[i] != x) break;
        update[i]->forward[i] = x->forward[i];
    }
 
    free (x);
 
    /* adjust header level */
    while ((list.listLevel > 0)
    && (list.hdr->forward[list.listLevel] == NIL))
        list.listLevel--;
}
 
Node *findNode(T data) {
    int i;
    Node *x = list.hdr;
 
   /*******************************
    *  find node containing data  *
    *******************************/
 
    for (i = list.listLevel; i >= 0; i--) {
        while (x->forward[i] != NIL
          && compLT(x->forward[i]->data, data))
            x = x->forward[i];
    }
    x = x->forward[0];
    if (x != NIL && compEQ(x->data, data)) return (x);
    return(0);
}
 
void initList() {
    int i;
 
   /**************************
    *  initialize skip list  *
    **************************/
 
    if ((list.hdr = (Node*)malloc(sizeof(Node) + MAXLEVEL*sizeof(Node *))) == 0) {
        printf ("insufficient memory (initList)\n");
        exit(1);
    }
    for (i = 0; i <= MAXLEVEL; i++)
        list.hdr->forward[i] = NIL;
    list.listLevel = 0;
}
 
int main(int argc, char **argv) {
    int i, *a, maxnum, random;
 
    /* command-line:
     *
     *   skl maxnum [random]
     *
     *   skl 2000
     *       process 2000 sequential records
     *   skl 4000 r
     *       process 4000 random records
     *
     */
 
    maxnum = atoi(argv[1]);
    random = argc > 2;
 
    initList();
 
    if ((a = (int*)malloc(maxnum * sizeof(*a))) == 0) {
        fprintf (stderr, "insufficient memory (a)\n");
        exit(1);
    }
 
    if (random) {
        /* fill "a" with unique random numbers */
        for (i = 0; i < maxnum; i++) a[i] = rand();
        printf ("ran, %d items\n", maxnum);
    } else {
        for (i = 0; i < maxnum; i++) a[i] = i;
        printf ("seq, %d items\n", maxnum);
    }
 
    for (i = 0; i < maxnum; i++) {
        insertNode(a[i]);
    }
 
    for (i = maxnum-1; i >= 0; i--) {
        findNode(a[i]);
    }
 
    for (i = maxnum-1; i >= 0; i--) {
        deleteNode(a[i]);
    }
    return 0;
}
castaway
08.10.2013, 17:17
  #11

Не по теме:

Я вообще то хотел твое мнение услышать. Ведь именно ты хотел разобраться в этой программе..

GambLex
0 / 0 / 0
Регистрация: 14.10.2012
Сообщений: 58
08.10.2013, 17:29  [ТС]     Скип-список #12
а какой вывод??
tzeentch
25 / 25 / 2
Регистрация: 13.04.2013
Сообщений: 79
08.10.2013, 17:40     Скип-список #13
Я кажись понял, в чем твоя проблема =)
Эту программу надо запускать не из IDE, а из командной строки.

Рецепт для Windows 7:
Скомпилируй программу, найди где находится exe-файл. Щелкни левой кнопкой по папке, удерживая [Shift], выбери в меню "Открыть окно команд" -> откроется командная строка. Введи:
ИМЯ_EXE_ФАЙЛА.exe 2000
и программа выполнится с 2000 числами.

ИМЯ_EXE_ФАЙЛА.exe 2000 r
и он выполнится с 2000 рандомными числами.
GambLex
0 / 0 / 0
Регистрация: 14.10.2012
Сообщений: 58
08.10.2013, 18:12  [ТС]     Скип-список #14
Цитата Сообщение от castaway Посмотреть сообщение

Не по теме:

Я вообще то хотел твое мнение услышать. Ведь именно ты хотел разобраться в этой программе..

позволяет найти нужный мне элемент в списке, но при этом не перебирает все элементы, а перескакивает на нужный. вроде так

Добавлено через 5 минут
Цитата Сообщение от tzeentch Посмотреть сообщение
Я кажись понял, в чем твоя проблема =)
Эту программу надо запускать не из IDE, а из командной строки.

Рецепт для Windows 7:
Скомпилируй программу, найди где находится exe-файл. Щелкни левой кнопкой по папке, удерживая [Shift], выбери в меню "Открыть окно команд" -> откроется командная строка. Введи:
ИМЯ_EXE_ФАЙЛА.exe 2000
и программа выполнится с 2000 числами.

ИМЯ_EXE_ФАЙЛА.exe 2000 r
и он выполнится с 2000 рандомными числами.
спасибо конечно) но у меня она не компилируется exception: ptr!=NULL

Добавлено через 14 минут
Цитата Сообщение от castaway Посмотреть сообщение

Не по теме:

Я вообще то хотел твое мнение услышать. Ведь именно ты хотел разобраться в этой программе..

по принципу записной книжки.Если тебе нужен Федор ты же не ищешь с начала, а переходишь сразу на букву Ф...
tzeentch
25 / 25 / 2
Регистрация: 13.04.2013
Сообщений: 79
09.10.2013, 14:16     Скип-список #15
Тот код, что я тут уже кидал, у меня компилится и работает нормально.
Code::Blocks, MinGW, Win7 64-bit.

Опишите подробнее проблему, Попробуйте пройтись по проге отладчиком...
GambLex
0 / 0 / 0
Регистрация: 14.10.2012
Сообщений: 58
09.10.2013, 14:22  [ТС]     Скип-список #16
этот же код у меня выводит при компиляции : exception: ptr!=NULL
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.10.2013, 21:25     Скип-список
Еще ссылки по теме:

Создать список группы (список всех студентов) и наименование дисциплин, которые они изучают - VBA
Кто поможет, огромный респект. Завтра уже показывать надо( Задание профессорам, академикам, членам СО РАН и простым смертным...

Дописать в список L после первого вхождения элемента Еl список L1 и удалить из L все оставшиеся элементы El - Turbo Pascal
Дописать в список L после первого вхождения элемента Еl список L1 и удалить из списка L все оставшиеся элементы Еl.

Список: Вывести на экран в обратном порядке введенный список - Lisp
Помогите решить задачку пожалуйста! Создать программу, выводящую на экран в обратном порядке введенный список!

Список: Сформировать список целых чисел и упорядочить их по неубыванию. - Free Pascal
Помогите сделать задачи! Будьте добры помогите!!!!!! 1. Сформировать список целых чисел и упорядочить их по неубыванию. 2. В данном...


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

Или воспользуйтесь поиском по форуму:
GambLex
0 / 0 / 0
Регистрация: 14.10.2012
Сообщений: 58
13.10.2013, 21:25  [ТС]     Скип-список #17
вариантов больше нет??
Yandex
Объявления
13.10.2013, 21:25     Скип-список
Ответ Создать тему
Опции темы

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