Моя проблема заключается в том, что при вводе любых значений в функцию сортировки на выводе получается -1, а не конкретный индекс элемента. В чем же недочет? Возможно проблемы в указателях...
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 <iostream>
#include <cstdlib>
using namespace std;
struct list
{
int field; // поле данных
struct list *ptr; // указатель на следующий элемент
};
struct list * init(int a) // а- значение первого узла
{
struct list *lst;
// выделение пам¤ти под корень списка
lst = (struct list*)malloc(sizeof(struct list));
lst->field = a;
lst->ptr = NULL; // это последний узел списка
return(lst);
}
struct list * addelem(list *lst, int number)
{
struct list *temp, *p;
temp = (struct list*)malloc(sizeof(list));
p = lst->ptr; // сохранение указател¤ на следующий узел
lst->ptr = temp; // предыдущий узел указывает на создаваемый
temp->field = number; // сохранение пол¤ данных добавл¤емого узла
temp->ptr = p; // созданный узел указывает на следующий элемент
return(temp);
}
void listprint(list *lst)
{
struct list *p;
p = lst;
do {
cout <<p->field; // вывод значени¤ элемента p
p = p->ptr; // переход к следующему узлу
} while (p != NULL);
}
struct list * sort( struct list *root )
{
struct list *new_root = NULL;
while ( root != NULL )
{
struct list *node = root;
root = root->ptr;
if ( new_root == NULL || node->field < new_root->field )
{
node->ptr = new_root;
new_root = node;
}
else
{
struct list *current = new_root;
while ( current->ptr != NULL && !( node->field < current->ptr->field ) )
{
current = current->ptr;
}
node->ptr = current->ptr;
current->ptr = node;
}
}
listprint(new_root);
return new_root;
}
int SearchBinary(int left,int right,int key, list* lst)
{
int mid;
while (1)
{list *p=lst;
mid = (left + right) / 2;
for(int i = 0; i < mid-1; ++i){
p->field=lst->field;
p = lst -> ptr;
}
if (key < (p -> field)) // если искомое меньше значени¤ в ¤чейке
right = mid - 1; // смещаем правую границу поиска
else if (key > (p -> field)) // если искомое больше значени¤ в ¤чейке
left = mid + 1; // смещаем левую границу поиска
else // иначе (значени¤ равны)
return mid; // функци¤ возвращает индекс ¤чейки
if (left > right) // если границы сомкнулись
return -1;
}
}
int main(){
list* lst = init(5);
int n;
cout << "vvedite kolvo elementov: ";
cin >> n;
for(int i = 1; i < n; ++i){
int value;
cout << "Vvedite " << i+1 << "-y element: ";
cin >> value;
addelem(lst,value);
}
sort(lst);
int key;
cout << endl;
cout<<"Vvedite key: ";
cin>>key;
int index;
index = SearchBinary(0,n,key,lst);
cout << "index: " << index << endl;
return 0;
} |
|