2013-03-30 4 views
0

Функция в порядке, тема достигнута. Всем спасибо.C++ Смещение массива указателей на структуры

У меня есть следующая очень простая структура внутри класса:

struct Data 
{ 
    string name1; 
    string name2; 
    string name3; 
    string name4; 
} 

инициализирует:

Data **data; 
data=new Data*[size]; 

Проблема заключается в том переложить все указатели на элементы массива с позиции N справа, так что я могу вставить новый элемент в N. Я пробовал разные вещи, но все закончилось массивом элементов, указывающих на один и тот же объект ...

У меня есть аналогичная функция, которая удаляет элемент и сдвигает все влево. Это прекрасно работает:

int Del_element(/*some parameters*/) 
{ 
    found=Bin_search(Name1,Name2); //binary search. Returns index of element. 
    if (found<0) return 0; //element wasn't found 

    delete data[found]; //delete pointer 
    for (int i=found; i<index-1; i++) //shift all pointers to the left 
    { 
     data[i]=data[i+1]; 
    } 
    index--; 
    return 1; 
} 

Функция, я реализовывал ниже:

void re_size() 
{ 
int size_old=size; 
size*=2; 
Data **tmp_array; 

tmp_array = new Data*[size]; 

copy(data, data+size_old, tmp_array); 
delete []data; 
data=new Data*[size]; 
data=tmp_array; 
} 



int Add(const string & Name1,const string & Name2,const string & Name3, const string & Name4) 
    { 
     int found=Bin_search(Name1,Name2); //binary search. Return positive number if found, or negative as the position to insert new element; 

    if (found>0) //if element already exists 
    { 
     return 0; 
    } 


if ((index+1)==size) {re_size();} 

data[index]= new Record(Name1,Name2,Name3,Name4); 
if (index>0) 
{ 
    for (int i=index; i>-found; i--) 
    { 
    *data[i]=*data[i-1]; 
    } 

    data[-found]->name1=Name1; 
    data[-found]->name2=Name1; 
    data[-found]->name3=Name1; 
    data[-found]->name4=Name1; 
} 

index++; 
return 1; 
} 

В принципе, я инициализировать новый элемент в конец массива, а затем скопировать элементы с конца массива найденной позиции и скопировать значения в данные [-found].

+0

Это домашнее задание? Кроме того, вы дали нам * код, который работает *, но не тот, который этого не делает? – mfontanini

+0

Я обновил свой ответ. Проверь это. – JalalJaberi

+0

Любая причина, по которой вы не используете 'std :: vector'? – mfontanini

ответ

0

Вы не указали неработающий код, поэтому мне придется угадать, что вы сделали неправильно.

Держу пари, вы переместили элемент 0 на 1, 1 на 2, 2 на 3 и т. Д. Но когда вы меняете 1 на 2, он содержит то, что первоначально было в 0. И тогда, когда вы меняете 2 на 3, он содержит то, что вы только что сдвинули с 1, изначально в 0. И так далее.

Вам необходимо сделать изменения, начиная с конца: N-1 в N, N-2 в N-1, N-3 в N-2 и т.д.

Тот факт, что вещи, которые Вы смещение - это указатели, которые совершенно не имеют значения, у вас будет такая же проблема с массивом чисел.

+0

Спасибо за ответ. Я добавил нерабочую функцию, надеюсь, что это может помочь. Фактически я перехожу от конца к началу, но, похоже, это не работает. – John

0

Во-первых, Del_element Функция здесь, чтобы удалить элемент для нового входящего указателя. Если это правда, то это не работает, потому что вы просто занимаете освобожденный элемент (data[first]) с новым (data[first+1]).

Но если вы уверены, что имеете в виду N равно size, а новый указатель на ввод должен быть мест в размере, это нормально.

Однако вы должны показать реальный и более полный код.

ОК, это лучше. Прежде всего, я думаю, что не так хорошо возвращать false в функцию с возвращаемым типом int. Во-вторых, я чувствую, что здесь есть большая проблема for (int i=index-1; i>-found; i--). Почему i>-found?

+0

Ну, он должен пройти через массив от конца до места, где мне нужно вставить новый элемент, сдвигая значения. Так что новые инициализированные данные [index + 1] = new Data ("", "", "", "") будут иметь значение последнего элемента массива и так далее. Кроме того, это -обнаружено, потому что найденное значение всегда отрицательно (когда элемент не был найден). – John

+0

@ Джон сначала, вы должны заботиться о 'index'. 'index + 1 JalalJaberi

Смежные вопросы