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

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

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

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

25.12.2012, 17:26. Просмотров 447. Ответов 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;
}
//работает только при единице, возвращает значение а
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.12.2012, 17:26     Линейный двусвязный список
Посмотрите здесь:

C++ Двусвязный линейный список
C++ Двусвязный линейный список
Двусвязный список C++
C++ Линейный двусвязный список
C++ Линейный двусвязный список
Двусвязный список C++
Двусвязный линейный список C++
Линейный Двусвязный список! C++
Линейный двусвязный список для хранения записей C++
C++ Двусвязный линейный список
Сформировать линейный двусвязный список C++
Двусвязный список C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zuxa-zuxa
Мишка Косолапый :)
282 / 252 / 3
Регистрация: 15.02.2012
Сообщений: 1,437
Завершенные тесты: 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;
А эти с свою очередь эквивалентны пустоте, поскольку ничего не делают, если написаны друг за другом.
Yandex
Объявления
15.12.2014, 13:49     Линейный двусвязный список
Ответ Создать тему
Опции темы

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