я написал двойной связанный список:Дважды связанного списка вставки элемент алгоритма недостатки
class doubled {
private:
class sublink {
private:
char data[30];
sublink *next_ptr;
sublink *previous_ptr;
friend doubled;
};
public:
sublink *first_ptr;
doubled(){first_ptr = NULL;};
void add_item(char *item);
void rm_item(char *item);
};
Проблема с функцией, чтобы добавить элемент в список:
void doubled::add_item(char *item){
sublink *new_data;
sublink *n_insert;
sublink *p_insert;
new_data = new sublink;
n_insert = new sublink;
p_insert = new sublink;
if(first_ptr == NULL){
strcpy(new_data->data, item);
new_data->previous_ptr = NULL;
new_data->next_ptr = first_ptr;
first_ptr = new_data;
} else {
strcpy(new_data->data, item);
n_insert = first_ptr;
while(1){
n_insert = n_insert->next_ptr;
if(n_insert == NULL)
break;
if(strcmp(n_insert->data, new_data->data) >= 0){
new_data->next_ptr = n_insert;
n_insert->previous_ptr = new_data;
}
}
p_insert = first_ptr;
while(1){
p_insert = p_insert->next_ptr;
if(p_insert == NULL)
break;
if((strcmp(p_insert->data, new_data->data)) < 0){
new_data->previous_ptr = p_insert;
p_insert->next_ptr = new_data;
}
}
}
std::cout << first_ptr->data << '\n';
std::cout << new_data->data << '\n';
if(new_data->next_ptr != NULL)
std::cout << new_data->next_ptr->data << '\n';
}
Введенный выше код вставляет данный элемент в список в алфавитном порядке.
Программа выводит first_ptr->data
и new_data->data
, но не выводит на new_data->next_ptr->data
, ни first_ptr->next_ptr->data
. Таким образом, утверждение if(new_data->next_ptr != NULL)
всегда верно и не должно быть.
У кого-нибудь есть проблемы с этой программой?
Оба ваши петли, пока они плохие. Вы должны делать что-то вроде этого: 'while (n_insert-> next_ptr! = Null) n_insert = n_insert-> next_ptr;' Но все это немного сложнее. Википедия довольно хороша для псевдокода: http://en.wikipedia.org/wiki/Doubly_linked_list#Inserting_a_node_2 –
Я пробовал это в первом алгоритме, я получаю ошибку сегментации, но thk – Lhaer
Ouch 'strcpy' в фиксированный -размер массива. Просто используйте 'std :: string', если сможете. Или если это домашнее задание, запрещающее части стандартной библиотеки, научитесь предотвращать переполнение буфера с помощью таких функций, как 'strncpy', или лучше, просто используйте' std :: string'. – aschepler