Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Связаные списки 
V
    Опции темы
zim22
Дата 7.4.2009, 07:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



FortMax, ?


--------------------
PM MAIL   Вверх
Slammer
Дата 12.4.2009, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 29.3.2006

Репутация: 1
Всего: 1



Спасибо zim22.
Есть ещё один вопросик косательно функции. 
Ф-я должна выбросить все те элементы из списка, за которыми идут парные числа.
Вродебы написал логически правильно, но она не работает .. ? хелп

Код

#include <iostream>
using namespace std;
struct node{
       int info;
       node *next;
};

node *first = NULL, *last = NULL, *p;

void nodeDel(node *first){
     node *tmp;
     tmp = first;
     while(tmp->next != NULL){
          tmp = tmp->next; 
          if((tmp->info % 2) == 0){
                delete first;
                first = tmp;
          }
          else {
               first = first->next;
          }     
     }
}
int main(){
    
    int menu;
    int x;
    int many; 
    
    cout << "How many elements you will use? "; 
    cin >> many;
    cout << "Input list of elements seperating by enter: ";
    
    //node *p;
    //p = new node;
    
    for(int i = 0; i < many; i++){
              cin >> x;
              p = new node;
              p->info = x;
              p->next = NULL;
              if(first == NULL){
                       first = last = p;
              }
              else{
                   last->next = p;
                   last = last->next;
              };
    }
    //menu
    while(menu != 3){
        cout << "Use Function on List (1)\nPrint List (2)\nDelete List & Exit (3)\n";
        cin >> menu;
        //(1)
        if(menu == 1){ 
            nodeDel(p);
        }
        //(2)
        if(menu == 1 || menu == 2){ 
            cout << "List consist of: " << endl;    
            for(p = first; p != NULL; p=p->next){
                    cout << p->info << endl;
            }
        }
    }
    //(3)
    p = first;
    while (p != NULL)
    {
        first = first->next;
        delete p;
        p = first;
    };
system("pause");    
return 0;    
}


PM MAIL   Вверх
zim22
Дата 12.4.2009, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(Slammer @  12.4.2009,  17:22 Найти цитируемый пост)
Ф-я должна выбросить все те элементы из списка, за которыми идут парные числа.


Цитата(Slammer @  12.4.2009,  17:22 Найти цитируемый пост)
  if((tmp->info % 2) == 0){

вы здесь проверяете число на чётность или не чётность. и в зависимости от этого уже удаляете его или нет. по крайней мере пытаетесь smile
Код

        if(menu == 1){ 
            nodeDel(p); // неправильно. необходимо  nodeDel(first)
        }

мой вам совет: используйте универсальный алгоритм.


--------------------
PM MAIL   Вверх
Slammer
Дата 15.4.2009, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 29.3.2006

Репутация: 1
Всего: 1



Спасибки. Немного подравил, но всёравно где-то допустил ошибку, или в удаление или в печати. Поможете найти?
В приложении показан ввод и нправильный вывод (должны быть 2 двойки)
Зарание признателен.
Код

#include <iostream>
using namespace std;
struct node{
       int info;
       node *next;
};

node *first = NULL, *last = NULL, *p;
node *start;

void nodeDel(node *&first){
     node *tmp;
     tmp = first;
     while(tmp->next != NULL){
          tmp = tmp->next; 
          
          if((tmp->info % 2) == 0){
                delete first;
                first = tmp;
          }
          else {
               first = first->next;
          }     
     }
}
int main(){
    
    int menu;
    int x;
    int many; 
    
    //saraksta viedosana
    cout << "How many elements you will use? "; 
    cin >> many;
    cout << "Input list of elements seperating by enter:" << endl;

    for(int i = 0; i < many; i++){//aizpildam sarakstu ar elementiem
              cin >> x;
              p = new node;
              p->info = x;
              p->next = NULL;
              if(first == NULL){
                       first = last = p;
              }
              else{//izveidojam noradi uz pedejo elementu
                   last->next = p;
                   last = last->next;
              };
    }
    //nodublejam
    start = first;
    
    //menu
    while(menu != 3){
        cout << "Use Function on List (1)\nPrint List (2)\nDelete List & Exit (3)\n";
        cin >> menu;
        //(1)
        if(menu == 1){ 
            nodeDel(first);
        }
        //(2)
        if(menu == 1 || menu == 2){ 
            cout << "List consist of: " << endl;    
            for(p = first; p != NULL; p=p->next){
                    cout << p->info << endl;
            }
        }
    }
    //(3)
    p = start;
    while (p != NULL)
    {
        first = first->next;
        delete p;
        p = first;
    };
system("pause");    
return 0;    
}





Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  scrn.JPG 26,71 Kb
PM MAIL   Вверх
bsa
Дата 16.4.2009, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Slammer, а отлаживать пробовал? Пройдись по шагам.
PM   Вверх
Dov
Дата 18.4.2009, 05:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 11
Всего: 88



Код
struct info
{
    int     number;
    bool    is_even;
};

struct node
{
    info    elem;
    node   *next;
};

bool   isEven     ( info   data );
void   inputData  ( info  *data );
void   insertItem ( info   data, node **item, node **last );
void   deleteItem ( node **item );
void   deleteEven ( node **item );
void   cleanList  ( node **item );
void   displayList( node * item );
void   displayMenu( );

int main()
{
    node   *first    = NULL; 
    node   *last     = NULL; 
    info    x;
    char    menu;
    int     many; 

    cout << "How many elements you will use? "; 
    cin  >>  many;
    cout << "Input list of elements seperating by enter:\n";

    for( int i = 0; i < many; i++ )
    {
        inputData ( &x );
        insertItem( x, &first, &last );
    }

    do
    {
        displayMenu();
        
        cin >> menu;

        switch(menu)
        {
        case '1':    
            deleteEven ( &first );        
            displayList( first );
            break;
        case '2':        
            displayList( first );
            break;
        case '3':
            cleanList  ( &first );
            cout << "\n...Have a nice day...\n\n";            
            break;
        default:
            cout << "\n...No such option!!\n";
        }

    }while( menu != '3' );

    return 0;
}


bool isEven( info data )
{
    return data.is_even;
}

void inputData( info *data )
{
    cin >> data->number;
    data->is_even = ( ( data->number ) % 2 ) == 0;
}

void insertItem( info data, node **item, node **last )
{
    node  *tmp;
    
    tmp       =  new node;
    tmp->elem =  data;
    tmp->next =  NULL;
    
    (*item ? (*last)->next : *item) = *last = tmp;
}

void deleteItem( node **item )
{
    node  *tmp;
    
    tmp    =  *item;
    *item  = (*item)->next;
    
    delete tmp;
}

void deleteEven( node **item )
{
    while( (*item)->next != NULL )
    {
        if(isEven((*item)->next->elem))
            deleteItem( item );
        else
            item = &(*item)->next;
    }
}

void cleanList( node **item )
{
    while( *item != NULL )
        deleteItem( item );
}

void displayList( node *item )
{
    cout << "\nList consist of:\n ";
    
    if(item == NULL)
        cout << "List empty..";
    else
        while( item != NULL )
        {
            cout << item->elem.number << ' ';
            item = item->next;
        }
}

void displayMenu()
{
    cout << "\n\n   Menu: ";
    cout << "\n-----------\n";
    
    cout << "1. Function on List\n"
         << "2. Print List\n" 
         << "3. Delete List & Exit\n";
    
    cout << "\nEnter your choice: ";
}



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
yeputons
Дата 19.4.2009, 21:47 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 1.4.2009
Где: Санкт-Петербург

Репутация: 2
Всего: 5



FortMax
  Связные списки удобно применять для такой задачи, которая регулярно (по крайней мере, у меня) возникает: есть массив, в который хотелось бы научиться быстро добавлять/удалять элементы и перебирать все элементы.  
  Если реализовывать это через обычные массивы/vector, то при добавлении элемента в начало требуется сдвигать все остальные элементы на  1. Это требуется около N операций, где N - старая длина массива.
  Если же решать эту задачу с двухсвязными списками, то удаление/добавление элемента из такого списка происходит за ~3 операции.
  Экономия времени очевидна)))

Если же не важно время выполнения (например добавляешь/удаляешь элемент один или два раза) - то используй vector - с ним гораздо удобнее и проще.


Это сообщение отредактировал(а) yeputons - 19.4.2009, 21:49
PM MAIL ICQ Skype   Вверх
zim22
Дата 20.4.2009, 07:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(yeputons @  19.4.2009,  21:47 Найти цитируемый пост)
 то при добавлении элемента в начало требуется сдвигать все остальные элементы на  1

используйте deque и будет вам вселенское счастье


--------------------
PM MAIL   Вверх
FortMax
  Дата 23.4.2009, 03:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 485
Регистрация: 2.10.2006
Где: Россия, г. Бироби джан ЕАО

Репутация: нет
Всего: 5



спс, всем, примерное представление сформировалось  smile 


--------------------
user posted image
PM MAIL ICQ   Вверх
Slammer
Дата 23.4.2009, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 29.3.2006

Репутация: 1
Всего: 1



Dov, это очень мило и я бы даже сказал красиво. Мешок картошки за вложеный труд.. но я больше половины не понял..  smile 
Код

(*item ? (*last)->next : *item) = *last = tmp;
  smile 

Опять прошу подправить мой код функции nodeDel. Которая должна удалять те элементы из списка, за которыми идут парные числа,
я просто не могу найти ошибку, хоть и кажется что всё правильно. :-(

пример список с элементами - 1(первый), 1, 2, 2(четвёртый) должен преоброзоватся в 1(первый), 2(четвёртый->во второй)
пожалуйста, обьясните как можно проще.
Спасибо всем!
Код

#include <iostream>
using namespace std;
struct node{
       int info;
       node *next;
};
node 
    *first = NULL, 
    *last = NULL, 
    *p = NULL;

void nodeDel(node *first){
     p = first;
     node *tmp = p;
     while (tmp != NULL){
           if(tmp->next != NULL){
                tmp = tmp->next;
                if((tmp->info%2) == 0 ){
                    cout << "Element " << p->info << " deleted!";
                 first->next=tmp;                          
                 delete p;
                    p = tmp;
                }
                p=tmp;
                //first->next = tmp; 
           }
           
     };
}
int main(){
    
    int menu;
    int x;
    int many; 
    
    cout << "How many elements you will use? "; 
    cin >> many;

    cout << "Input list of elements seperating by enter:" << endl;
    for(int i = 0; i < many; i++){//aizpildam sarakstu ar elementiem
              cin >> x;
              p = new node;
              p->info = x;
              p->next = NULL;
              if(first == NULL){
                       first = last = p;
              }
              else{//izveidojam noradi uz pedejo elementu
                   last->next = p;
                   last = last->next;
              };
    }
    
    //menu
    do{
               
     cout << "__________MENU___________\n\n" 
             << "Use Function on List (1)\n"
             << "Print List (2)\n"
             << "Delete List & Exit (3)\n"
             << "_________________________\n\n";
        cin  >> menu;
        cout << "_________________________\n\n";
    
        //(1)
        if(menu == 1){ 
             nodeDel(first);
        }
        //(2)
        if(menu == 1 || menu == 2){ 
            cout << "List consist of: " << endl;    
            for(p = first; p != NULL; p=p->next){
                    cout << p->info << endl;
            }
        }
    }while(menu != 3);
    //(3)
    p = first;
    while (p != NULL){
        first = first->next;
        delete p;
        p = first;
    };
system("pause");    
return 0;    
}


PM MAIL   Вверх
bsa
Дата 23.4.2009, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Slammer, ну и чего ты не понял? Все элементарно:
Код
(*item ? (*last)->next : *item) = *last = tmp;
можно преобразовать в:
Код
if (*item != 0)
   (*last)->next = tmp;
else
   *item = tmp;
*last = tmp;


А по поводу кода своего, ну кто тебе  мешает воспользоваться отладчиком? Он позволяет пройтись по программе шаг за шагом наблюдая все изменения переменных.
PM   Вверх
Dov
Дата 24.4.2009, 01:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 11
Всего: 88



Цитата(Slammer @  23.4.2009,  22:24 Найти цитируемый пост)
Опять прошу подправить мой код функции nodeDel. 

Подправляю, если тебе это поможет..
Код
void nodeDel( node **first )
{
    node   *tmp;

    while( (*first)->next != NULL )
    {
        
            if( (( (*first)->next->info) % 2 ) == 0 )
            {
                cout << "Element " << (*first)->info << " deleted!\n";            
                
                tmp     =  *first;
                *first  = (*first)->next;
                
                delete tmp;
            }
            else
                first = &(*first)->next;        
    }
}


вызываешь в main так:
Код

    //(1)
    if( menu == 1 )
    {
        nodeDel(&first );
    }




--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Slammer
Дата 24.4.2009, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 29.3.2006

Репутация: 1
Всего: 1



Dov  smile
Отладчик.. некогда им не пользовался (оно и видно), сейчас смотрю..
Всем спасибо  smile 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1158 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.