Консультация № 137046
16.05.2008, 10:50
0.00 руб.
0 1 1
Доброго времени суток, уважаемые эксперты! Помогите пожалуйста с однонаправленным списком на С++, а именно приведите пример кода, который реализует вставку, удаление элементов. Пожалуйста, оформите в виде функций. Спасибо за помощь.

Обсуждение

Неизвестный
17.05.2008, 02:04
общий
это ответ
Здравствуйте, Alex_kh!
Работа с динамическими структурами данных, например, списками, сводится к внимательной работе с указателями на элементы. Важно не терять ссылки на существующие элементы, потому что из-за этого будет расходоваться лишняя память, которая не будет доступна внутри программы ввиду отсутствия её адреса. В приложении - пример реализации однонаправленного списка, функции добавления элементов в конец списка и после заданной позиции, функии удаления элемента из конца и элемента по заданной позиции. Для работы со списком необходим указатель на первый его элемент, в общем случае можно передавать этот указатель в каждую из функций, в моём примере он хранится в виду глобальной переменной. Также, в функциях вставки и удаления по позиции не реализована проверка передаваемого индекса.
Удачи!

Приложение:
struct Sp { //список int k; //Какое-то значение в элементе Sp *next; //Ссылка на следующий элемент списка} *bibl, *first; // указатели на текущий и первый элементыvoid NewElEnd (Sp x) //добавление элемента в конец{ Sp* s; bibl = first; //Начинаем с начала списка s = new Sp; //Выделяем память под новый элемент s->k = x.k; //Переписываем значение элемента s->next = NULL; //Ссылка наследующий - null if (bibl!=NULL) { //Если в списке есть элементы while (bibl->next!=NULL) bibl = bibl->next; //Идём в его конец bibl->next = s; //Запоминаем ссылку на новый элемент в предыдущем } else { //Если это будет первый элемент first = s; //Запоминаем его }}void NewElIns (Sp x, int pos) //Вставляет элемент x после pos-того элемента{ Sp* s; bibl = first; //Начинаем с начала списка s = new Sp; //Выделяем память под новый элемент s->k = x.k; //Переписываем значение элемента if (bibl == NULL) {first = s; return;} //Если это будет первый элемент, запоминаем и выходим int i = 1; //Счётчик while (i<pos && bibl->next!=NULL) {i++; bibl = bibl->next;} //Идём до pos-того элемента s->next = bibl->next; //В ссылку на следующий во вставляемом элементе ставим ссылку из pos-того элемента bibl->next = s; //В pos-том элементе запоминаем ссылку на новый}void DelFromEnd () //Удаляет элемент из конца списка{ bibl = first; //Начинаем с начала if (bibl->next==NULL) { //Если элемент единственный delete bibl; //Удаляем его first = NULL; return; //И выходим } while (bibl->next->next!=NULL) bibl = bibl->next; //Ищем предпослежний элемент Sp* a = bibl->next; //Запоминаем удаляемый элемент bibl->next = NULL; //Перескакиваем через ссылку удаляемого элемента (этим удаляем его из списка) delete a; //Удаляем элемент из памяти}void DelFromPos (int pos) //Удаляет элемент по его позиции{ bibl = first; //Начинаем с начала if (bibl->next==NULL) { //Если элемент единственный delete bibl; //Удаляем его first = NULL; return; //И выходим } int i = 1; //Счётчик while (i<pos-1 && bibl->next!=NULL) {i++; bibl = bibl->next;} //Ищем элемент, предшествующий удаляемому Sp* a = bibl->next; //Запоминаем удаляемый элемент bibl->next = a->next; //Перескакиваем через ссылку удаляемого элемента (этим удаляем его из списка) delete a; //Удаляем элемент из памяти}
Форма ответа