Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include <iostream>
- #include <locale>
- using namespace std;
- struct point{
- int data;
- point* next;
- };
- struct pointd{
- char* key;
- pointd* next;
- pointd* pred;//указатель на предыдущий элемент
- };
- void print_list(point* beg)
- //печать списка
- {
- point* p = beg;//начало списка
- while (p != 0)
- {
- cout << p->data << "\t";
- p = p->next;//переход к следующему элементу
- }
- }
- point* make_list(int n)
- {
- point*beg;//указатель на первый элемент
- point*p, *r;//вспомогательные указатели
- beg = new(point);//выделяем память под первый элемент
- cout << "Введите значение 1 эл-та :" << endl;
- cin >> beg->data;//вводим значение информационного поля
- beg->next = 0;//обнуляем адресное поле
- //ставим на этот элемент указатель p (последний элемент)
- p = beg;
- for (int i = 0; i<n - 1; i++)
- {
- r = new(point);//создаем новый элемент
- cout << "Введите значение " << i + 2 << " эл-та :" << endl;
- cin >> r->data;
- r->next = 0;
- p->next = r;//связываем p и r
- //ставим на r указатель p (последний элемент)
- p = r;
- }
- return beg;//возвращаем beg как результат функции
- }
- point* del_point(point*beg)
- //удаление первого эл-та с чётным значением, 0 не считается чётным
- {
- point*p = beg;
- bool flag = true;
- while (p != NULL && flag){ //Проверяем, есть ли необходимый эл-т
- if (p->data % 2 == 0 && p->data != 0){
- flag = false; //Если эл-т существует останавливем цикл
- }
- p = p->next;
- }
- p = beg;
- if (flag == true) cout << "НЕТ ЭЛ-ТА С ЧЁТНЫМ ЗНАЧЕНИЕМ" << endl << endl;
- else{
- if (p->data % 2 == 0 && p->data != 0){ //Проверяем голову на чётность
- beg = p->next;
- delete p;
- }
- else{ // Если голова нечётная, продолжаем поиск в списке
- while (p->next->data % 2 != 0 && p->next != NULL || p->next->data == 0){ //Идём по списку до первого чётного или конца, пропуская 0
- p = p->next;
- }
- if (p->next != NULL && p->next->next != NULL){ //Если находим эл-т в середине списка
- point* r = p->next; //Запоминаем нужный эл-т
- p->next = r->next; //Изменяем указатель через эл-т
- delete r; //Удаляем необходимый эл-т
- }
- else{ //Если найденый эл-т последний
- point* r = p->next;
- p->next = NULL;
- delete r;
- }
- }
- }
- return beg;
- }
- point* del(point*beg)
- //удаление списка из памяти
- {
- point*p = beg;
- while (p != NULL){
- point* r = p;
- p = p->next;
- delete r;
- }
- return beg;
- }
- void main1(){
- setlocale(LC_ALL, "rus");
- int n;
- cout << "РАБОТА С ОДНОСВЯЗНЫМ СПИСКОМ:" << endl << endl;
- cout << "Введите кол-во элементов" << endl;
- cin >> n;
- point* beg = make_list(n);
- cout << "Исходный список : " << endl;
- print_list(beg);
- cout << endl;
- cout << "Список после обработки : " << endl << endl;
- beg = del_point(beg);
- print_list(beg);
- cout << endl;
- beg = del(beg);
- cout << "Список удалён из памяти" << endl;
- }
- void print_list_point2(pointd* beg)
- //печать списка
- {
- pointd* p = beg;//начало списка
- while (p != 0)
- {
- cout << p->key << "\t";
- p = p->next;//переход к следующему элементу
- }
- }
- void print_list2_point2(pointd* beg)
- //печать списка
- {
- pointd* p = beg;//начало списка
- while (p != 0)
- {
- cout << p->key << "\t";
- p = p->pred;//переход к следующему элементу
- }
- }
- pointd* make_point2()
- //создание одного элемента
- {
- pointd*p = new(pointd);
- p->next = 0; p->pred = 0;//обнуляем указатели
- char s[50];
- cout << "\nEnter string:";
- cin >> s;
- p->key = new char[strlen(s) + 1];//выделение памяти под строку
- strcpy(p->key, s);
- return p;
- }
- pointd*make_list_point2(int n)
- //создание списка
- {
- pointd *p;
- pointd *beg;
- beg = make_point2();//создаем первый элемент
- for (int i = 1; i<n; i++)
- {
- p = make_point2();//создаем один элемент
- //добавление элемента в начало списка
- p->next = beg;//связываем р с первым элементом
- beg->pred = p;//связываем первый элемент с p
- beg = p;// p становится первым элементом списка
- }
- return beg;
- }
- pointd* add_point2(pointd* beg, int k){
- pointd* p = beg;
- pointd* r = new pointd();
- int i = 1;
- if (k != 1){ //Когда указываем номер > 1
- while (p->next != NULL){ //Проходим до конца списка + ищем и запоминаем необходимый эл-т
- p = p->next;
- i++;
- if (i == k) r = p;
- }
- }
- else{ //Если указан номер 1
- r = beg;
- while (p->next != NULL) p = p->next;
- }
- pointd* nwp = new pointd(); //Создаём новый эл-т и копируем его значения из сохранённого эл-та
- nwp->key = r->key;
- nwp->next = NULL;
- nwp->pred = p; //Вставляем в конец
- p->next = nwp;
- return beg;
- }
- void main2(){
- setlocale(LC_ALL, "rus");
- int n, k;
- bool flag = true;
- cout << "РАБОТА С ДВУСВЯЗНЫМ СПИСКОМ:" << endl << endl;
- cout << "Введите кол-во элементов" << endl;
- cin >> n;
- pointd* beg = make_list_point2(n);
- cout << "Исходный список : " << endl;
- print_list_point2(beg);
- cout << endl;
- while (flag){
- cout << "Эл-т под каким номером добавляем? ";
- cin >> k;
- if (k > n || k < 1)cout << "Неверно указан номер" << endl;
- else flag = false;
- cout << endl;
- }
- cout << "Список после добавление элемента" << endl;
- cout << endl;
- beg = add_point2(beg, k);
- print_list_point2(beg);
- cout << endl;
- while (beg->next != 0){ beg = beg->next; }
- print_list2_point2(beg);
- cout << endl;
- for (int i = 0; beg->next != 0; i++){
- beg = beg->next;
- delete beg->pred;
- }
- delete beg;
- }
- point* make_list3(int n)
- {
- point*beg;//указатель на первый элемент
- point*p, *r, *d;//вспомогательные указатели
- beg = new(point);//выделяем память под первый элемент
- cout << "Значение первого эл-та ?" << endl;
- cin >> beg->data;//вводим значение информационного поля
- beg->next = 0;//обнуляем адресное поле
- for (int i = 0; i < n - 1; i++){
- p = beg;
- r = new(point);
- cout << "Введите значение " << i + 2 << " эл-та" << endl;
- cin >> r->data;
- r->next = NULL;
- if (r->data < beg->data){
- while (p->next != NULL && r->data < p->next->data){
- p = p->next;
- }
- r->next = p->next;
- p->next = r;
- }
- else{
- r->next = beg;
- beg = r;
- }
- }
- return beg;
- }
- point* add_in_list3(point* beg, int n){
- point* r = new(point);
- r->data = n;
- r->next = NULL;
- point* p;
- p = beg;
- if (n > beg->data){ //Проверяем с головой
- r->next = beg;
- beg = r;
- }
- else{
- while (p->next != NULL && n < p->next->data){ //Идём по списку пока значение нового эл-та не станет меньше или до конца
- p = p->next;
- }
- r->next = p->next;
- p->next = r;
- }
- return beg;
- }
- void main3(){
- setlocale(LC_ALL, "rus");
- int n, K, a;
- char* N;
- cout << "РАБОТА С ОДНОСВЯЗНЫМ УПОРЯДОЧЕННЫМ СПИСКОМ:" << endl << endl;
- cout << "Введите кол-во элементов" << endl;
- cin >> n;
- point* beg = make_list3(n);
- cout << "Исходный список : " << endl;
- print_list(beg);
- cout << endl;
- cout << "Кол-во вставляемых эл-тов ?" << endl;
- cin >> K;
- for (int i = 0; i < K; i++){
- cout << "Введите значение "<< i+1 << " нового эл-та:" << endl;
- cin >> a;
- beg = add_in_list3(beg, a);
- }
- cout << endl;
- cout << "Список после обработки : " << endl;
- print_list(beg);
- cout << endl;
- }
- void main(){
- setlocale(LC_ALL, "rus");
- cout << "Работа со списками." << endl;
- int choice;
- do
- {
- cout << endl << "Выберите действие:" << endl
- << "1. Создать односвязный список (список создастся по типу очередь)" << endl
- << "2. Создать двусвязный список (список создастся по типу стек)" << endl
- << "3. Создать упорядоченный список (создастся односвязный список)" << endl
- << "4. Выйти из программы\n";
- cin >> choice;
- switch (choice)
- {
- case 1:main1(); break; //создание односвязного списка
- case 2: main2(); break; //создание двусвязного списка
- case 3: main3(); break; //создание упорядоченного списка
- }
- } while (choice != 4);
- }
Advertisement
Add Comment
Please, Sign In to add comment