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

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

Войти
Регистрация
Восстановить пароль
 
Шерлок
0 / 0 / 0
Регистрация: 02.12.2012
Сообщений: 16
#1

Линейный двусвязный список - C++

25.12.2012, 17:26. Просмотров 481. Ответов 1
Метки нет (Все метки)

Тип элемента списка определен так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
struct llist{
    int val;
    llist *next,*pred;};
    //Создаётся статический список из 3 эл-тов
    llist a,b,c;
    llist a={3,&b,NULL},b={2,&c,&a},c={1,NULL,&b},*ph=&a;
    int get(llist *p){return p->val;}
//дана ф-ция
    llist*fun(llist *z,int n)
    {llist *q;
    for (q=z;n!=0;q=q->next,n--);
    if(q->next==q){
        delete q;
        return NULL;}
    if(q==z) z=q->next;
    q->pred->next=q->next;
    q->next->pred=q->pred;
    delete q;
    return z;}
Определить выполняемое действие над списком, напишите вызов данной ф-ции для данного статического списка.
Реализация+вызов описаны ниже. В целом, что делает ф-ция понятно, но как именно она это делает, непонятно+работает, но как-то косячно. Помогите пожалуйста разобраться для чего q и z и эти 2 строчки непонятны : q->pred->next=q->next;
q->next->pred=q->pred;

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
#include "stdafx.h"
#include <locale.h>
 
 
struct llist{
    int val;
    llist *next,*pred;};
    //Создаётся статический список из 3 эл-тов
    extern llist a,b,c;
    llist a={3,&b,NULL},b={2,&c,&a},c={1,NULL,&b},*ph=&a;
    int get(llist *p){return p->val;}
//дана ф-ция
    llist*fun(llist *z,int n)
    {llist *q;
    for (q=z;n!=0;q=q->next,n--);
    if(q->next==q){
        delete q;
        return NULL;}
    if(q==z) z=q->next;
    q->pred->next=q->next;
    q->next->pred=q->pred;
    //delete q;
    return z;}
 
int _tmain(int argc, _TCHAR* argv[])
{setlocale(LC_ALL, "rus");
int n;
printf ("Введите n:   ");
scanf("%i",&n);
printf ("%i \n",get(fun(ph,n)));
    return 0;
}
//работает только при единице, возвращает значение а
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.12.2012, 17:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Линейный двусвязный список (C++):

Линейный двусвязный список - C++
Задали задачу, реализовать линейный двусвязный список, и функцию к нему - удаление узла. Читал литературу, правда в спешке, искал по форуму...

Двусвязный линейный список - C++
Здравствуйте. Помогите пожалуйста в написании программы: Реализовать класс на основе двусвязного линейного списока Реализовать в нем...

Линейный двусвязный список - C++
Список задан структурой struct *node { char info; node *prev; node *next; }; и была введена некоторая последовательность...

Двусвязный линейный список - C++
Дан Двусвязный линейный список. ну например фамилия и имя. как сделать добавление в начало списка? и как объявлять его? помогите

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

Двусвязный линейный список - C++
Помогите пожалуйста написать эти программы :( Двусвязный линейный список, Быстрая сортировка ,Пузырьковая с...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
zuxa-zuxa
Мишка Косолапый :)
282 / 252 / 3
Регистрация: 15.02.2012
Сообщений: 1,440
Завершенные тесты: 1
15.12.2014, 13:49 #2
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
#include <stdio.h>
#include <string>
#include <iostream>
#include <locale.h>
 
using namespace std; 
 
struct llist
{
    int val;
    llist *next,*pred;
};
    //Создаётся статический список из 3 эл-тов
    extern llist a,b,c;
    llist a={3,&b,NULL},b={2,&c,&a},c={1,NULL,&b},*ph=&a;
    int get(llist *p){return p->val;}
//дана ф-ция
    llist *fun(llist *z,int n)
    {
        llist *q;
        for (q=z;n!=0;q=q->next,n--);
        if(q->next==q)
        {
            delete q;
            return NULL;
        }
        if(q==z) z=q->next;
        q->pred->next=q->next;
        q->next->pred=q->pred;
        //delete q;
        return z;
    }
 
void main(int argc, char* argv[])
{
    setlocale(LC_ALL, "rus");
    int n;
    printf ("Введите n:   ");
    scanf("%i",&n);
    printf ("%i \n",get(fun(ph,n)));
    system("pause");
}
При значении 1 программа работает, выдает результат 3. С другими значениями не хочет работать.

И меня смущают эти строки:
C++
1
2
        q->pred->next=q->next;
        q->next->pred=q->pred;
Помойму таки они эквивалентны строкам:
C++
1
2
        q=q->next;
        q=q->pred;
А эти с свою очередь эквивалентны пустоте, поскольку ничего не делают, если написаны друг за другом.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.12.2014, 13:49
Привет! Вот еще темы с ответами:

Двусвязный линейный список - C++
Мне нужно написать класс двусвязный список со всеми базовыми методами. У меня есть несколько проблем: во-первых, удаление из хвоста...

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

Линейный двусвязный список для хранения записей - C++
Добрый вечер. Нужна блок-схема к данному коду #include &quot;stdafx.h&quot; #include &lt;iostream&gt; //директива для ввода вывода #include...

Вставить в линейный список перед элементом с заданным значением другой линейный список - C++
Как можно вставить в линейный список перед элементом с заданным значением другой линейный список? Как один элемент вставлять, я знаю, а вот...


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

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

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