Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 79, средняя оценка - 4.76
vaselo
19 / 19 / 1
Регистрация: 17.10.2010
Сообщений: 247
#1

Кольцевой односвязный список - C++

06.04.2011, 19:57. Просмотров 10949. Ответов 23

Доброго времени суток, требуется помощь в создании односвязного кольцевого списка. смог только этот быдлокод:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
struct stud
{
   int m;
   stud* l;
   stud* r;
};
 
stud* FindLast(stud* firstC)
{
    if(firstC==NULL) return NULL;
    stud *tmp=firstC;
    while(tmp!=firstC)
        tmp=tmp->next;// переходим на последний элемент
    return tmp;//возвращает указатель на сущ. последний элемент
}
void showC(stud* firstC)
{
    while(FindLast(firstC)!=firstC)
    {
        cout<<endl<<firstC->name;
        firstC=firstC->next;
    }
}
void add(stud* &firstC)
{
    if(firstC==NULL)
    {
        cout<<"Input string: ";
        firstC=new stud;
        cin>>firstC->name;
        firstC->next=NULL;
        return;
    }
    stud* p=new stud;
    cout<<"Input string: ";
    cin>>p->name;
    p->next=firstC;
    firstC=p;
    FindLast(firstC)->next=firstC;;//находим последний ссылаем его на новодобавленный
}
void del(stud* &firstC)
{
    if(firstC!=NULL && FindLast(firstC)==NULL){delete firstC; firstC=NULL; return;}
    if(firstC==NULL) {cout<<"\nAlready empty"; Sleep(200); return;}
    stud*p=firstC;
    while(p->next->next!=firstC)
        p=p->next;//нашли предпоследний
    delete p->next;//удалили посл.
    p->next=firstC;//предпоследний->первый
}
Добавлено через 1 час 23 минуты
слегка разобрался с остальными, а вот второй и дальше никак не хочет добавлять
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
stud* FindLast(stud* firstC)
{
    if(firstC==NULL) return NULL;
    stud *tmp=firstC;
    while(tmp!=firstC)
        tmp=tmp->next;// переходим на последний элемент
    return tmp;//возвращает указатель на сущ. последний элемент
}void add(stud* &firstC)
{
    if(firstC==NULL)
    {
        cout<<"Input string: ";
        firstC=new stud;
        cin>>firstC->name;
        firstC->next=NULL;
        return;
    }
    stud* p=new stud;
    cout<<"Input string: ";
    cin>>p->name;
    p->next=firstC;
    firstC=p;
    FindLast(firstC)->next=firstC;//находим последний ссылаем его на новодобавленный
}
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.04.2011, 19:57
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Кольцевой односвязный список (C++):

Кольцевой односвязный список - C++
Есть список программа удаляет добавляет редактирует сортирует есть поиск но если сначала добавить потом еще добавить потом редактировать...

Кольцевой односвязный список - C++
Реализовал класс для работы со списком студентов( использовал кольцевой односвязный список). Для навигации по классу используется...

Кольцевой односвязный список - C++
Собственно что это и с чем его едят! Как реализовать, если это что-то страшное! Задача : сделать класс реализующий односвязный...

Односвязный кольцевой список - C++
Односвязный кольцевой список. в качестве аргумента передается значение value. Если оно есть в списке, необходимо вместо первого...

Односвязный кольцевой список, реализовать - C++
Помогите написать и реализовать кольцевой список

Кольцевой односвязный список, сортировка - C++
Помогите, пожалуйста, с сортировкой списка. #include &lt;iostream&gt; #include &lt;stdlib.h&gt; using namespace std; struct Node { int...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
25.04.2011, 16:44 #16
VladSharikov, Возможно position никогда не становится NULL... Вообще если список кольцевой - то это абсолютно логично.
По сути position == NULL, когда в списке нет ничего. В других случаях оно не может быть равным NULL.
0
VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
25.04.2011, 16:49 #17
Также.. подумал тут...
чтобы вернутся на несколько элементов назад(n) нужна такая функция.

C++
1
2
3
4
5
6
7
 void my_list::back_step(int step){
//Переходит на step записей назад
        go_first();
        for(int i = 1; i <= step; i++) {
            position = position->next;
        }
}
так?

Добавлено через 48 секунд
2 #16. И вправду. Что-то я не о том думаю! логично!

Добавлено через 1 минуту
Вопрос из той же оперы? Возможно ли узнать где мы находимся сейчас в данный момент? Или мы всегда находимся в конце списка?
И да... с массивами было проще
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
25.04.2011, 16:50 #18
VladSharikov, Вообщем на несколько элементов назад вернуться невозможно, ибо список односвязный. Исключительно на несколько элементов вперед. НО если учитывать что он кольцевой, тогда теоретически возможно прохождение всего списка до головы и проход далее. Но проход назад в односвязном списке по идее не соответствует его концепции. А функция да, верная по-моему.

position это и есть место где мы находимся в данный момент...
0
VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
25.04.2011, 17:31 #19
А зачем переход до головы, если можно просто присвоить position = head? тоесть начало списка?

А в функции моей нужно исправить steps на (count - steps) и тогда поидее она будет верной и будет работать, как думаете?

Добавлено через 3 минуты
Хотя count это ведь общее количество элементов списка... Тоесть мы получается с конца делаем три шага назад и указываем на этот элемент(например 10 элементов было, стали указывать на 7 элемент, даже если я находился на 6 позиции. Все равно в итоге будем указывать на 7 позицию.) и не важно на какой позиции мы находились, я прав?

Добавлено через 15 минут
Все таки как узнать где мы находимся в данный момент?
Где мы должны находится в данный момент? по моему или в начале, или в конце. Посередине вроде никак?

к position не обратится , ибо он private, да еще и указатель!
Как?!

Добавлено через 15 минут
Кстати! При добавлении элемента в список таким образом
C++
1
2
3
4
5
6
7
8
9
boy1[] = "ruslan";
boy2[] = "vlad";
boy3[] = "viktor";
boy4[] = "nikolay";
 
guys.insert(boy1);
guys.insert(boy2);
guys.insert(boy3);
guys.insert(boy4);
Происходит ошибка... В общем выводит так.

1 - 4 - 3 - 2
Код
ruslan
nikolay 
victor 
vlad
код вывода такой
C++
1
2
3
4
5
6
7
    // вывод списка на экран guys
    guys.go_first();
    for(int i = 1;i<=guys.size();i++){
        cout << guys.show() << endl;
        guys.go_next();
    }
    cout << endl;
Код самого insert
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void my_list::insert(char* str){
//Вставляет запись за текущей.
        nodes* new_node = new nodes;
        strcpy(new_node->data,str);
        if(position != NULL){
                new_node->next = position->next;
                position->next = new_node;
        } else {
                new_node->next = new_node;
                position = head = new_node;
        }
        count++;
}
Что не так, не знаете? найти не могу!
0
Delya
1 / 1 / 0
Регистрация: 25.04.2011
Сообщений: 3
25.04.2011, 18:12 #20
можете помочь примерно с такой задачей?
1
VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
25.04.2011, 18:36 #21
Задачу то пишите а еще лучше создать для этого новую тему
0
Delya
1 / 1 / 0
Регистрация: 25.04.2011
Сообщений: 3
25.04.2011, 21:02 #22
я создала тему, ниже вашей
0
Vladimir.
155 / 155 / 10
Регистрация: 24.11.2009
Сообщений: 375
28.04.2011, 06:38 #23
VladSharikov, что конкретно Вас смутило?


а, понял. Обратите внимание на то, что инсертер вставляет новый элемент за текущим либо в начало, если список пуст. В примере обращений текущим является всё время первый элемент, поэтому вставка происходит на вторую позицию с соответсвующим сдвигом.
0
patricksmirnov
74 / 74 / 10
Регистрация: 28.02.2010
Сообщений: 159
04.12.2011, 11:37 #24
Скажите, пожалуйста, что значит это:
strcpy(new_node->data,str);
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.12.2011, 11:37
Привет! Вот еще темы с ответами:

Кольцевой односвязный список, удалить из него все отрицательные числа - C++
Здравствуйте, необходимо решить проблему в задаче: &quot;Сформулируйте кольцевой список с вещественным информационным полем и удалите из него...

Сформировать односвязный кольцевой линейный список по файлу целых чисел - C++
Помогите пожалуйста,разобраться..для меня тема новая,не очень понимаю как написать код к заданию: Сформировать односвязный кольцевой...

Реализовать кольцевой список. Как закольцевать список обычный? - C++
Помогите пожалуйста реализовать кольцевой список. Я так понимаю, он может быть двусвязным и односвязным? Меня интересует односвязный....

Сформировать список из 10 книг, используя динамическую структуру данных односвязный список - C++
друзья спасайте Сформировать список из 10 книг, используя динамическую структуру данных односвязный список С++


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
04.12.2011, 11:37
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru