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

Массив указателей типа void (функция удаления,расширения) - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
CROSP
3 / 3 / 0
Регистрация: 13.06.2012
Сообщений: 114
19.09.2013, 18:32     Массив указателей типа void (функция удаления,расширения) #1
Вот есть задание создать такую структуру данных как изображена на изображении
http://s12.postimg.org/mqd3wuxf1/image.png
Вот не как не могу нормально написать функцию удаление элемента и расширения , ну и соответственно удаление всего списка.
Постоянно выскакивает сообщение типа "SIGABRT" .
Немного о структуре. Массив из указателей типа void*, каждый из указателей в массиве указывает на структуру , за исключением 2 первых элементов , они берутся как служебные .size – размер массива (количество элементов, на которое рассчитан массив),count – реальное количество элементов в списке.
Затем указатель на начало массива передвигается на 2 элемента вперед , соответственно нулевой элемент будет 3 на самом деле.

Подскажите пожалуйста где накосячил .
Вот код.
pointerarray.cpp
C++ (Qt)
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
#include "pointerarray.h"
pointerArray::pointerArray(int initialSize)
{
     this->start = new void* [initialSize+2];/* запрашиваем память для  нового массива*/
    this->initArr(initialSize);
 
}
 
pointerArray::pointerArray()
{
     this->start = new void* [DEF_SIZE+2]; /* запрашиваем память для  нового массива*/
    this->initArr(DEF_SIZE);
 
}
 
void pointerArray::initArr(int initSize) {
    this->start+=2;  /*опускаем указатель вниз на два элемента чтобы он указывал на первый указатель а не на служебный элемент*/
 
 
    ((int*)this->start)[POS_CNT]  = 0; /*Заполняем служебный элемент массива – количество элементов списка*/
 
    ((int*)this->start)[POS_SZ]  =  initSize; /*Заполняем служебыій элемент массива – размер массива */
}
 
void pointerArray::ExpendArrPtr (){
    expandDef(((int*)this->start)[POS_SZ],DELTA);
}
 
void** pointerArray::getStart() {
    return this->start;
}
 
void pointerArray::ExpendArrPtr (int incSize)
{
  expandDef(((int*)this->start)[POS_SZ],incSize);
}
void pointerArray::expandDef (int sizeOld,int incSize) {
 
    int  sizeNew = sizeOld + incSize;
  void**   arOld = this->start; /*вспомогательный бестиповый указатель на начало массива указателей*/
  this->start = new void* [sizeNew+2]; /*выделение места для нового массива*/
 
 
  for (int i = sizeOld; i>= 0; i--)
  {
      this->start[i]=arOld[i];
  }
 
   arOld-=2;
   ((int*)this->start)[POS_CNT]  = ((int*)arOld)[POS_CNT];
   ((int*)this->start)[POS_SZ]  = sizeNew;
 
  delete []arOld; //освобождаем память
    this->start+=2; /* ставим указатель массива на первый указатель в новом массиве */
}
 
void pointerArray::showList() {
    int cnt=((int*)this->start)[POS_CNT];
    for (int k = 0; k <cnt; k++)
        {
          cout<<((TStruct*)this->start[k])->name<<"\n";
          cout<<((TStruct*)this->start[k])->age<<"\n";
        }
 }
int pointerArray::findElList(string key){
    /* start – указатель на список
      key – ключ поиска
      posFndEl – индекс найденного элемента
      findOk – результат поиска (true – если найден элемент,
               false – если не найден элемент с таким ключом)
   */
 int posFndEl;
 int    middl; /*middl выступает как индекс среднего элемента
              массива*/
 int     hi, low;   /*текущие границы - верхняя, нижняя*/    /*элемент не найден*/
 
      /*берем из мссива значение служебного элемента cunt
        И проверяем пуст ли список*/
 
 if (((int*)this->start)[POS_CNT] == 0)
 {
    posFndEl = 0;
    return -1;
 }
      /*Устанавливаем границы поиска на границы массива*/
 low = 0;
 hi = ((int*)this->start)[POS_CNT] - 1;
 
 do
 {
    middl = (hi + low) / 2 ; /*индекс среднего элемента*/
 
     if (key==((TStruct*)(this->start[middl]))->name)
        { posFndEl = middl;      /*элемент найден*/
        return posFndEl;
        }
     if (key<((TStruct*)(this->start[middl]))->name)
        {
          hi = middl - 1;
       }
     else
        {
         low = middl + 1;
       }
 
 } while  (low <= hi);
 posFndEl= -1;
 return posFndEl;/*Перебран весь массив. Искомый элемент не найден. Определена позиция возможной вставки нового элемента*/
}
void pointerArray::replaceEl(void* newEl,int place){
    if (place<0) {
        return;
    }
     delete ((TStruct*)(this->start[place]));
     this->start[place] = newEl;
}
void pointerArray::replaceEl(int age ,string name,int place){
    if (place<0) {
        return;
    }
    ((TStruct*)(this->start[place]))->age = age;
    ((TStruct*)(this->start[place]))->name = name;
    
}
 
void pointerArray::delFromList(int posDel){
int cnt=((int*)this->start)[POS_CNT];
if (posDel<0){
    return;
}
      cout<<(TStruct*)this->start[posDel];
         for (int k = posDel; k<cnt-1; k++)
              {
             this->start[k] = this->start[k+1];
         }
cnt--;
       ((int*)this->start)[POS_CNT]=cnt;
 
}
void pointerArray::addToSort(void* pnew, int posAdd)
{
    /*
         start – указатель на список
         pnew – указатель на новый элемент списка, который размещен
                     в памяти  и поля его заполнены
         posAdd – индекс элемента в массиве, в который необходимо вставить
                         указатель на новый элемент
    */
 
int cnt=((int*)this->start)[POS_CNT];
int sz= ((int*)this->start)[POS_SZ];
 
  //если массив переполнен, то вызываем расширение массива
if (cnt == sz)
        {
       this->ExpendArrPtr();
        }
 
 
 if (posAdd == cnt) //добавляемый элемент располагается в конце списка
        {
        this->start[posAdd] = pnew;
        }
  else
        {     // сдвиг элементов в массиве указателей на 1 вправо
         for (int k = cnt-1; k >= posAdd; k--)
              {
                  this->start[k+1] = this->start[k];}
                  this->start[posAdd] = pnew;
               }
 cnt++;
 
 ((int*)this->start)[POS_CNT]=cnt;
} //addToSort
void pointerArray::showInfo() {
    cout<<((int*)this->start)[POS_CNT]<<"\n";
     cout<<((int*)this->start)[POS_SZ];
}
Pointerarray.h
C++ (Qt)
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
#ifndef POINTERARRAY_H
#define POINTERARRAY_H
 
#define POS_SZ 2
#define POS_CNT -1
#define DEF_SIZE 10
#define DELTA 4
 
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>
 
using namespace std;
 
typedef struct {
         int age;
         string name;
   } TStruct;
 
 
class pointerArray {
public:
    pointerArray(int initialSize);
    pointerArray();
    void showList ();
    void delFromList(int posDel);
    void ExpendArrPtr ();
    void ExpendArrPtr (int incSize);
    int findElList(string key);
    void showInfo();
    void addToSort(void* pnew, int posAdd);
    void** getStart();
    void replaceEl(void* newEl,int place);
    void replaceEl(int age ,string name,int place);
    void delFromList();
     ~pointerArray() {
};
private:
     void** start;
     void initArr(int initSize);
     void expandDef (int sizeOld,int incSize);
};
 
#endif // POINTERARRAY_H
main.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int main(int argc, char** argv) {
    pointerArray arr(3);
    void* el = new TStruct;
    ((TStruct*)el)->age =35;
    ((TStruct*)el)->name = "One";
    void* el1 = new TStruct;
    ((TStruct*)el1)->age =2;
    ((TStruct*)el1)->name = "Two";
    void* el2 = new TStruct;
    ((TStruct*)el2)->age =3;
    ((TStruct*)el2)->name = "three";
     void* el3 = new TStruct;
    ((TStruct*)el3)->age =6;
    ((TStruct*)el3)->name = "four";
    
    arr.addToSort(el,0);
    arr.addToSort(el1,1);
    arr.addToSort(el2,2);
    arr.addToSort(el3,3);
   arr.delFromList(0);
 
    return 0;
}
Спасибо заранее
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.09.2013, 18:32     Массив указателей типа void (функция удаления,расширения)
Посмотрите здесь:

массив указателей на void* C++
Ошибка компиляции: error C2562: main: функция типа "void" C++
Функция получает массив указателей на строки и возвращает строку в динамической памяти, содержащую объединенный текст из входных строк C++
Арифметика указателей (указатель на void*) C++
Создать массив указателей с возможностью удаления любого элемента C++
Задача с использованием функции типа void и указателей, как параметров функций C++
C++ Массив указателей на функции, возвращающие значения разного типа
Использование указателей типа VOID C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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