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

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

Восстановить пароль Регистрация
 
Шерлок
0 / 0 / 0
Регистрация: 02.12.2012
Сообщений: 16
25.12.2012, 17:26     Линейный двусвязный список #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++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zuxa-zuxa
Мишка Косолапый :)
 Аватар для zuxa-zuxa
281 / 251 / 3
Регистрация: 15.02.2012
Сообщений: 1,384
Завершенные тесты: 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     Линейный двусвязный список
Ответ Создать тему
Опции темы

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