Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.01.2013, 19:08   #1
S.I.D.
 
Регистрация: 16.12.2012
Сообщений: 8
Восклицание Дан указатель P1 на первый элемент непустого двусвязного списка Продублировать в списке все элементы с нечетными значениями

Дан указатель P1 на первый элемент непустого двусвязного списка
Продублировать в списке все элементы с нечетными значениями
(новые элементы добавлять перед существующими элементами с такими же значениями).
Есть код на С++, нужно его переделать в Pascal.
Буду очень благодарен
Код:
#include<iostream>
#include<stdlib.h>
#include<time.h>
struct nodes{
    int data;
    nodes* prev;
    nodes* next;
};

nodes* generate(int n);     // создаст нам список из n элементов, вернёт указатель на голову.
void destruct(nodes* ptr);  // Уничтожит все элементы списка начиная с *ptr.
void show(nodes* ptr);      // выведет на экран все элементы начиная с  *ptr.

int main(void){
    nodes* p1 = generate(5);
    show(p1);
    //=========================Решение
    nodes* iterator = p1;
    if(iterator->data%2 == 0){
        iterator->prev = new nodes;
        iterator->prev->data = iterator->data;
        iterator->prev->prev = NULL;
        iterator->prev->next = iterator;

        p1 = iterator->prev;
    }

    while(iterator->next!=NULL){
        if(iterator->next->data%2 == 0){
            iterator->next->prev = new nodes;
            iterator->next->prev->data = iterator->next->data;
            iterator->next->prev->next = iterator->next;
            iterator->next->prev->prev = iterator;

            iterator->next = iterator->next->prev;
            iterator = iterator->next;
        }
        iterator = iterator->next;
    }
    //=========================

    show(p1);

    destruct(p1);
        p1 = NULL;
    return 0;
}

nodes* generate(int n){
    if (n<1) return NULL;

    srand(time(NULL));

    nodes* head = new nodes;
    head->next = NULL;
    head->prev = NULL;
    head->data = rand()%10+1;
    for(int i=1;i<n;i++){
        head->prev = new nodes;
        head->prev->next = head;
        head->prev->prev = NULL;
        head->prev->data = rand()%10+1;
        head = head->prev;
    }

    return head;
}

void show(nodes* ptr){
    if(ptr == NULL) return;
    while(ptr!=NULL){
        std::cout<<ptr->data<<"\t";
        ptr = ptr->next;
    }
    std::cout<<std::endl;
}

void destruct(nodes* ptr){
    if(ptr == NULL) return;

    do{
        nodes* tmp = ptr;
        ptr = ptr->next;
        delete tmp;
    }while(ptr!=NULL);
}

Последний раз редактировалось S.I.D.; 23.01.2013 в 19:13.
S.I.D. вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дан одномерный массив. Удалить все элементы последовательности значения,которые кратны k Кристюша5 Паскаль, Turbo Pascal, PascalABC.NET 4 27.05.2012 21:46
Найти позицию кратчайшей последовательность в списке A в котором встречаются все значения из списка B. xaoc2 Свободное общение 1 12.06.2011 23:26
LISP.разделить список на 2, в первый поместить четные элементы исходного списка, во второй - нечетные mashik2503 Помощь студентам 1 17.05.2011 19:14
В двусвязном списке продублировать те элементы, которые меньше следующего, но больше больше предыдущего. gvenog Помощь студентам 0 13.12.2010 21:20