C++ 指向指向C+中结构的指针数组的指针+;
我需要一些帮助,我正在学习数据结构,我得到了一个任务来编写一个基于指向结构的指针数组的程序,该数组可以添加元素并使用数组执行其他任务。我有下一个级别模型:C++ 指向指向C+中结构的指针数组的指针+;,c++,data-structures,C++,Data Structures,我需要一些帮助,我正在学习数据结构,我得到了一个任务来编写一个基于指向结构的指针数组的程序,该数组可以添加元素并使用数组执行其他任务。我有下一个级别模型: first level --> net of shops second level --> shop third level --> goods 我已经为这个写过了 typedef struct { QString date; QString prod_code; QStri
first level --> net of shops
second level --> shop
third level --> goods
我已经为这个写过了
typedef struct
{
QString date;
QString prod_code;
QString name;
}goods;
typedef struct
{
QString address;
QString number;
void **sublevel;
}shop;
typedef struct
{
QString website;
QString name;
QString owner;
QString address;
void **sublevel;
}net;
然后我创建了全局变量void**Start,它指向指针数组:
// init list
void ** init_list()
{
void** p = new void*[SIZE_AR];
p = p+2;
((int*)p)[COUNT_POS] = 0;
((int*)p)[SIZE_POS] = SIZE_AR;
return p;
}
void ** Start = init_list();
COUNT_POS - index of elements where I store count of currently used elemnets
SIZE_POS - size of array allocated in dynamic memory
SIZE_AR - default size for array
但当我试图将元素添加到最后一级时,我会遇到分段错误
(对于前两个工程,罚款):
//如果数组填充过多,则展开数组
空隙膨胀率(空隙**&ar、内部和尺寸、内部Cnt)
{
无效**arW;
arW=新空隙*[SizeAr+DELTA+2];
对于(int K=SizeAr-1;K>=0;K--){
arW[K+2]=ar[K];
}
SizeAr=SizeAr+DELTA;
ar=ar-2;
删除[]应收账款;
ar=arW+2;
((int*)ar)[COUNT_POS]=Cnt;
((int*)ar)[SIZE_POS]=SizeAr;
}
//二进制搜索
void bin_搜索(void**start,QString键,int&pos,bool&find,Cmpmethod func)
{
int mid;
int高,低;
发现=错误;
如果((int*)开始[计数位置]==0)
{
pos=0;
qDebug()名称、pos、查找、比较商品);
addtosort((((车间*)(开始))->次级、Pnew、pos);
}
//在第二级中查找要添加的项
无效查找位置(QString键)
{
int pos;
布尔发现;
整数计数=((整数*)开始)[计数位置];
for(int i=0;i子级、键、位置、查找、比较商店);
如果(查找)
{
货物*Pnew=新货物;
Pnew->date=“foo”
Pnew->name=“bar”
添加商品(((净*)(开始)[pos])->次级,Pnew);
打破
}
}
}
<>这会导致什么问题?这是一个C代码,上面有几个C++的函数。(就像
new
,也在使用Qt
。但是我不明白为什么OP会将其编码为c
程序,因为使用了Qt
@drescherjm,OP似乎在上课,这是一项任务。是的,我实际上是在用数据结构编写gui,我在大学里完成了这个任务,我没有T添加整个代码。也使用VoUL**代替适当类型的指针声音,这样C++就这样一个小C++。
// expand array if it overfilled
void ExpandArrPtr (void **&ar, int &SizeAr, int Cnt)
{
void **arW;
arW = new void*[SizeAr+DELTA+2];
for (int K = SizeAr-1; K >= 0; K--) {
arW[K+2] = ar[K];
}
SizeAr = SizeAr + DELTA;
ar=ar-2;
delete []ar;
ar=arW+2;
((int*)ar)[COUNT_POS] = Cnt;
((int*)ar)[SIZE_POS] = SizeAr;
}
// binary search
void bin_search(void **start, QString key, int &pos, bool &find, Cmpmethod func)
{
int mid;
int high, low;
find = false;
if((int*)start[COUNT_POS] == 0)
{
pos = 0;
qDebug()<<"zero elem\n";
return;
}
low = 0;
high = ((int*)start)[COUNT_POS] - 1;
do
{
mid = (high + low) / 2;
int result = func(start[mid], key);
if(result == 0)
{
pos = mid;
find = true;
return;
}
else if(result == 1)
{
high = mid - 1;
}
else
{
low = mid + 1;
}
}while(low <= high);
pos = low;
}
// function for adding in any level
void addtosort(void **&start, void *pnew, int pos)
{
int count = ((int*)start)[COUNT_POS];
int size = ((int*)start)[SIZE_POS];
if(count == size)
{
ExpandArrPtr(start, size, count);
}
if(pos == count)
{
start[pos] = pnew;
}
else
{
for(int i = count;i >= pos;i--)
{
start[i+1] = start[i];
}
start[pos] = pnew;
}
count++;
((int*)start)[COUNT_POS] = count;
}
void add_goods(void **&Start, goods * Pnew)
{
int pos;
bool find;
bin_search((((shop*)(Start))->sublevel), Pnew->name, pos, find, compare_goods);
addtosort((((shop*)(Start))->sublevel), Pnew, pos);
}
// finding the item in second level to add
void find_place(QString key)
{
int pos;
bool find;
int count = ((int*)Start)[COUNT_POS];
for(int i = 0;i < count;i++)
{
bin_search(((net*)(Start)[i])->sublevel, key, pos, find, compare_shop);
if(find)
{
goods * Pnew = new goods;
Pnew->date = "foo"
Pnew->name = "bar"
add_goods(((net*)(Start)[pos])->sublevel, Pnew);
break;
}
}
}