Удаление элементов из однонаправленного списка

Из динамических структур можно удалять элементы, т.к. для этого достаточно изменить значения адресных полей.

 

 

Рис. Удаление элемента из списка

 

point* del_point(point*beg,int k) {

//удаление элемента с номером k из списка

point*p=beg;

if (k==0) { //удаление первого элемента

beg=beg->next;

delete p;

return beg;

}

//проходим по списку до элемента с номером k-1

for(int i=1;i<k&&p->next!=0;i++)

p=p->next;

/*если такого элемента в списке нет, то возвращаем

указатель на начало списка в качестве результата

функции*/

if (p->next==0) return beg;

point* r=p->next;//ставим указатель r на k-й элемент

p->next=r->next;//связываем k-1 и k+1 элемент

delete r;//удаляем k-й элемент из памяти

return beg;

}

 

Пример1. Создание и печать однонаправленного списка

#include <iostream.h>

#include<string.h>

//описание структуры

struct point{

char *name; //информационное поле

int age; //информационное поле

point*next; //адресное поле

};

 

point* make_point(){

//создание одного элемента

point*p=new(point);//выделить память

char s[20];

cout<<"\nEnter the name:";

cin>>s;

//выделить память под динамическую строку символов

p->name=new char[strlen(s)+1];

strcpy(p->name,s);

//записать информацию в строку символов

cout<<"\nEnter the age";

cin>>p->age;

p->next=0;//сформировать адресное поле

return p;

}

 

void print_point(point*p) {

//печать информационных полей одного элемента списка

cout<<"\nNAME:"<<p->name;

cout<<"\nAGE:"<<p->age;

cout<<"\n--------------------------------\n";

}

 

point* make_list(int n) {

//формирование списка из n элементов

point* beg=make_point();//сформировать первый элемент

point*r;

for(int i=1;i<n;i++) {

r=make_point();//сформировать следующий элемент

//добавление в начало списка

r->next=beg;//сформировать адресное поле

beg=r;//изменить адрес первого элемента списка

}

return beg;//вернуть адрес начала списка

}

 

int print_list(point*beg) {

//печать списка, на который указывает указатель beg

point*p=beg;//р присвоить адрес первого элемента списка

int k=0;//счетчик количества напечатанных элементов

while(p) { //пока нет конца списка

print_point(p);

//печать элемента, на который указывает элемент p

p=p->next;//переход к следующему элементу

k++;

}

return k;//количество элементов в списке

}

 

void main() {

int n;

cout<<"\nEnter the size of list";

cin>>n;

point*beg=make_list(n);//формирование списка

if (!print_list(beg))

cout<<"\nThe list is empty";}

 

Перед компиляцией кода в среде MSVC++ необходимо в меню Options/Project отключить режим Use Microsoft Foundation Classes.

 

Задания

1.Наберите код программы из Примера 1. Выполните компиляцию и запуск программы.

2.Сформируйте однонаправленный список с символьным информационным полем. На основе кода из Примера 1 выполните удаление из этого списка элемента с указанным номером. Выполните печать списка до и после изменений.

3.Сформируйте однонаправленный список с вещественным информационным полем. Добавьте в этот список заданный элемент после первого элемента с аналогичным информационным полем. Выполните печать списка до и после изменений.

Домашние задания

1. Индивидуальное задание. Номер варианта определяется по журналу. Решите задачу данной группы, выполняя следующие требования:

1) Сформировать однонаправленный список, тип информационного поля указан в варианте.

2) Распечатать полученный список.

3) Выполнить обработку списка в соответствии с заданием.

4) Распечатать полученный список.

5) Удалить список из памяти.

Варианты индивидуального задания

Тип информационного поля Критерии обработки списка
1. int Удалить из списка все элементы с четными информационными полями.
2. double Удалить из списка все элементы с четными номерами.
3. int Удалить элементы, информационное поле которых оканчивается на заданную цифру z.
4. int Удалить из списка первый элемент с четным информационным полем.
5. int Удалить из списка последний элемент с четным информационным полем.
6. char* Добавить в список элемент после элемента с заданным информационным полем.
7. char* Добавить в список элемент с заданным номером.
8. double Добавить в список после каждого элемента с отрицательным информационным полем элемент с информационным полем равным 0.
9. char* Добавить в список элементы с нечетными номерами.
10. int Удалить из списка все элементы с четными информационными полями.
11. double Удалить из списка все элементы с четными номерами.
12. int Удалить из списка первый элемент с четным информационным полем.
13. int Удалить из списка последний элемент с четным информационным полем.
14. char* Добавить в список элемент после элемента с заданным информационным полем.
15. char* Добавить в список элемент с заданным номером.
16. double Добавить в список после каждого элемента с отрицательным информационным полем элемент с информационным полем равным 0.
17. char* Добавить в список элементы с нечетными номерами.
18. int Удалить из списка все элементы с четными информационными полями.
19. double Удалить из списка все элементы с четными номерами.
20. int Удалить из списка первый элемент с четным информационным полем.
21. int Удалить из списка последний элемент с четным информационным полем.
22. char* Добавить в список элемент после элемента с заданным информационным полем.
23. char* Добавить в список элемент с заданным номером.
24. double Добавить в список после каждого элемента с отрицательным информационным полем элемент с информационным полем равным 0.
25. char* Добавить в список элементы с нечетными номерами.
26. int Удалить из списка все элементы с четными информационными полями.
27. double Удалить из списка все элементы и информационными полями, не превосходящими заданного числа Р.
28. char* Добавить после каждого элемента с указанным информационным полем аналогичный элемент.








Дата добавления: 2015-02-16; просмотров: 2710;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.009 сек.