Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: уважаемые, прошу помощи с односвязными списками  (Прочитано 7814 раз)
0 Пользователей и 1 Гость смотрят эту тему.
alena
Интересующийся

ru
Offline Offline

« : 13-04-2011 20:49 » 

написала программу для работы с односвязными списками, а именно с очердью, необходимо было удалить конкретный элемент из очереди и вставить в список после определенного(функции remove и insert  соответственно), возникает проблема при вызывании подряд нескольких remove: например, при удалении 3-его элемента(теперь 4-ый будет "на месте" того третьего) если пробовать удалить 4-ый - не удаляет, то есть с одинакового места не удаляет, не могу понять в чем проблема, ведь удаляет по номеру в списке...вот код
Код: (C++)
#include <iostream>
# include <locale.h>
using namespace std;
class Spisok{
private:
        struct Node
        {int number;
        Node *next;}
        *first;//ещё нужен указатель на начало в этой секции, *с имеет такой же тип, как и структура,т.к. после '}'не стоит ';'//???как вводить n, нужно написать функцию, в которой можно будет изменять n???
       
public:
       
        Spisok()
        {
                first=new(struct Node);
                first->number=1;
                first->next=NULL;}
       
        void sozdanie (int n);//добавление в конец очереди=создание списка
        void print ();//вывод очереди на печать
        void remove ();//удаление заданного элемента из очереди
        void insert ();//вставка элемента после заданного
        void renumbering ();//перенумерация списка
};

int main()
{setlocale(LC_ALL,"Rus");

Spisok M,X;
int n;
cout<<"Введите количество элементов списка: "<<endl;
cin>>n;
if(n!=0)
{              

                M.sozdanie(n);
                M.print();
                M.remove();M.print();M.remove();M.print();M.remove();
                M.print();
                M.insert();
                M.print();
                M.renumbering();
                M.print();
        }
else cout<<"Нет элементов списка!!!"<<endl;
return 0;
}

void Spisok::sozdanie(int n)
{
int i;
Node *a,*b;
a=first;
b=first;
        for(i=2;i<=n;i++)
        {
                a=new (Node);
                a->number=i;
                a->next=NULL;
                b->next=a;
                b=a;
        }
}
void Spisok::print()
{Node *a;
a=first;
cout<<a->number;
while (a->next!=NULL)
        {
                a=a->next;
                cout<<"  "<<a->number;
        }
        cout<<endl;
};
void Spisok::remove()
{Node *a,*b;
        int udal;
        cout <<"Введите номер элемента,который нужно удалить: ";
        cin>>udal;
        if (udal==1)//если нужно удалить первый элемент
                first=first->next;
        else
        {
                a=first;
                udal=udal-1;
                while(a->next!=NULL)
                        {
                                if ((a->next!=NULL)&&(a->number==udal))
                                        {
                                                b=a;
                                                a=a->next;
                                                b->next=a->next;
                                        }
                        else if(a->number!=udal)
                                a=a->next;
                        }
                a=a->next;}
}
void Spisok::insert()
{
        Node *a, *c;
        c=first;
        Node *d;       
        d=new (Node);
        cout<<"Введите номер элемента,который нужно вставить:";
        cin>>d->number;
        d->next=NULL;
        cout<<endl;    
//если совпадают - то вставка осуществляется после текущего элемента, проверка в случае, когда нужно вставить элемент в начало списка
        if ((d->number)>=(c->number))
                {
                        a=c;
                        while (a->next!=NULL)
                                {
                                        if((d->number)<=(a->next->number))
                                                {
                                                        d->next=a->next;
                                                        a->next=d;
                                                        break;
                                                }
                                        a=a->next;
                                }
                        if (a->next==NULL)
                                a->next=d;
                }
        else
                {
                        d->next = c;first=d;
                }
                //создавать-то создает, но при выходе из функции возвращает значение с, потом связь с->нэкст теряется почему-то??
}
void Spisok::renumbering()
{cout<<endl;
Node *a;
        a=first;
        a->number=1;
        while(a->next!=NULL)
                if ((a->next->number)==(a->number)+1)
                        a=a->next;
                else (a->next->number)=((a->number)+1);
}

Добавлено через 1 минуту и 20 секунд:
комментарии во вставке  - рабочие, не обращайте внимание
« Последнее редактирование: 13-04-2011 21:32 от Джон » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 13-04-2011 21:04 » 

1. Найди предыдущий удаляемому узел.
2. Присвой его next значение next удаляемого узла.
3. Уничтожь удаляемый узел.

Все...
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
alena
Интересующийся

ru
Offline Offline

« Ответ #2 : 13-04-2011 21:08 » 

в том и дело,что список одно!связный, по сути это же и делаю, в ф-ии remove, но почему не удаляет с одого и того же по расположению места в списке?
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 13-04-2011 21:25 » 

Что такое номер в списке (очереди)?
Это Node->number или порядковый номер в списке?

смотри что получается...
Тебе нужно удалить 3-й после создания... Ты ищешь Node->number ==3 и успешно удалаяешь
Потом ты опять пытаешься удалить 3-й, а его нет....
Или же ты указываешь удалить Node->number == 4 ... Так вот он удалится..., но он будет по порядковому номеру третьим
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
alena
Интересующийся

ru
Offline Offline

« Ответ #4 : 14-04-2011 03:00 » 

третьего как раз-таки и нет, вот мы его удалили, теперь "на его месте" стоит 4-ый(1 2 4 5 6...), так вот теперь этот 4-ый не удалится, если попытаться его удалить....

Добавлено через 14 минут и 50 секунд:
всё, дошло до меня.... в алгоритме рассмотрела частный случай, где нет "дырок", вводится номер удаляемого элемнта, отнимается единица(в случае, если он не первый),таким образом находится "предыдущий"... а если его нет?...так что переделаю)))спасибо большое)
« Последнее редактирование: 14-04-2011 03:15 от Elena-ta » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 14-04-2011 03:28 » 

Elena-ta,
зачем вот так делать, это же некрасиво
Цитата
struct Node
        {int number;
        Node *next;}
        *first;

вот так лучше
Код:
struct Node
{
    int number;
    Node* next;
};

Node* first;
       
Записан

alena
Интересующийся

ru
Offline Offline

« Ответ #6 : 14-04-2011 03:49 » 

Алексей1153++,
спасибо большое) учту)
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines