Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 06.03.2017
Сообщений: 11

Кольцевые списки на базе двунаправленных списков

06.03.2017, 08:13. Показов 1491. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет! Помогите решить задачу:
Пусть L обозначает кольцевой двунаправленный список с включенным заглавным звеном. Написать функцию удаления из списка L первого звена , содержащего отрицательный элемент (если такое звено найдется).

Добавлено через 36 минут
есть набросок, но выдает системную ошибку

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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#include "StdAfx.h"
#include <iostream>
#include < conio.h >
 
using namespace std;
 
struct node
{
  int elem;
  node *sled;
  node *pred;
};
 
class Spisok
{
  private:
    node *nsp;
  public:
    Spisok() {nsp=NULL;}
    void BuiltRing ();
    void VyvodLeftRight();
    void Poisk ();
    void Delete (node*);
    void Ochistka ();
};
 
void main ()
{ 
    setlocale(LC_ALL,"RUS");
  
    Spisok A;
    A. BuiltRing ();   
       cout<< "До удаления: \n";
    A. VyvodLeftRight ();   
    A. Poisk();
       cout<< "После удаления: \n" ; 
    A. VyvodLeftRight ();
 
  getch (); 
  A.Ochistka ();
}
 
void Spisok::BuiltRing ()
// Построение двунаправленного кольцевого списка nsp 
{
  node *r;
  int el;
  //Построим заглавное звено кольцевого списка.
  nsp = new(node);
  r = nsp; (*nsp).pred = NULL; (*nsp).sled = NULL;
 
  cout<<"Введите элементы списка: \n";
    cin>>el;
  while  (el!=0)
  {
    (*r).sled = new (node);
    (*((*r).sled)).pred = r; r = (*r).sled;
    (*r).sled = NULL; (*r).elem = el;
    cin>>el;
  }
  //А теперь - образуем кольцевой список!
  if  ((*nsp).sled!=NULL)
    { (*((*nsp).sled)).pred = r; (*r).sled = (*nsp).sled; }
  else
    cout<<"Кольцевой список пуст!\n";
}
 
void Spisok::VyvodLeftRight ()
// Вывод содержимого двунаправленного кольцевого списка
// с  заглавным звеном "по часовой стрелке".
// nsp - указатель на заглавное звено списка.
{
  node *r;
 
  cout<<"Кольцевой список: ";
  if  ((*nsp).sled!=NULL)
  {
    cout<<(*((*nsp).sled)).elem<<" ";
    r = (*((*nsp).sled)).sled;
    while  (r!=(*nsp).sled)
      { cout<<(*r).elem<<" "; r = (*r).sled; }
    cout<<endl;
  }
  else cout<<"пуст!";
}
void Spisok::Poisk ()
    //поиск отрицательного элемента
{ node *p;
 
  p = (*nsp).sled;
    
  while ( p!= nsp && (*p).elem >0) 
    {
     p = (*p).sled;
    }
 
   if (p!= nsp)
 
       Delete(p);
 
}
void Spisok::Delete (node *Res)
// Удаление из кольцевого двунаправленного списка
// звена, на которое указывает ссылка Res.
// nsp - указатель на заглавное звено списка.
{
  if  ((*Res).sled==Res)
    { (*nsp).sled = NULL; delete Res; }
  else
  {
    (*(*Res).sled).pred = (*Res).pred;
    (*(*Res).pred).sled = (*Res).sled;
    if  ((*nsp).sled==Res)
      // Удаляем "первое" звено кольца.
      (*nsp).sled = (*Res).sled;
    delete Res;
  }
}
 
 
void Spisok::Ochistka()
{
  node *q,*q1;
 
  q = (*((*nsp).sled)).sled;
  q1 = (*q).sled;
  while (q1!=(*((*nsp).sled)).sled)
    { delete q; q=q1; q1=(*q1).sled; }
  delete q;
  delete nsp;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.03.2017, 08:13
Ответы с готовыми решениями:

Использование двунаправленных списков
Здравствуйте. Помогите решить задачу. Задание: Переместить во второй список все элементы, находящиеся после элемента с максимальным...

Кольцевые списки
люди добрые, написал программу, теперь надо в ней сделать эти три списка в один кольцевой, но при этом вывод данных должен остаться таким...

Реализация двунаправленных списков в компьютере
Задание: 1. инициализация списка: присвоение текущему, начальному и конечному указателю неопределенного значения; 2. помещение в список...

6
Helper C/C++
 Аватар для Invader0x7F
286 / 163 / 122
Регистрация: 22.09.2016
Сообщений: 518
06.03.2017, 10:00
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
 
typedef struct List
{
    int n_val;
    List* prev;
    List* next;
} LIST;
 
LIST* pList = NULL, *pHead = pList, *pTail = pList;
 
int main(int argc, char** argv)
{
    srand((unsigned)time(NULL));
    
    for (int i = 0; i < 10; i++)
    {
        LIST* pNode = new LIST;
        pNode->n_val = (rand() % 10 + 1) - (rand() % 10 + 1);
        pNode->prev = pTail; pNode->next = NULL;
 
        printf("%d ", pNode->n_val);
 
        if (pList != NULL)
        {
            pTail->next = pNode;
            pTail = pNode;
        }
 
        else
        {
            pList = pNode;
            pHead = pTail = pList;
        }
    }
 
    pTail->next = pList;
 
    printf("\n\n");
 
    bool found = false;
    while (pList != NULL && !found)
    {
        if (pList->n_val < 0)
        {
            found = true;
            if (pList->prev != NULL)
                pList->prev->next = pList->next;
            else {
                pList->next->prev = NULL;
                pTail->next = pList->next;
            }
        
            if (pList->next != NULL)
                pList->next->prev = pList->prev;
            else {
                pList->prev->next = pTail;
            }
 
            pList = pList->next;
        }
 
        else pList = pList->next;
    }
 
    int n = 0;
    while (pList != NULL)
    {
        printf("n_val[%d] = %d\n", n, pList->n_val);
        _getch();
        
        pList = pList->next;
        n++;
    }
 
    return 0;
}
0
0 / 0 / 0
Регистрация: 06.03.2017
Сообщений: 11
06.03.2017, 10:08  [ТС]
спасибо, все работает. Но можно сделать без рандома? Ввод данных должен осуществляться пользователем
0
Helper C/C++
 Аватар для Invader0x7F
286 / 163 / 122
Регистрация: 22.09.2016
Сообщений: 518
06.03.2017, 10:20
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
 
typedef struct List
{
    int n_val;
    List* prev;
    List* next;
} LIST;
 
LIST* pList = NULL, *pHead = pList, *pTail = pList;
 
int main(int argc, char** argv)
{
    srand((unsigned)time(NULL));
    
    for (int i = 0; i < 10; i++)
    {
        LIST* pNode = new LIST;
        printf("Enter a value n_val = "); scanf("%d",&pNode->n_val);        
        pNode->prev = pTail; pNode->next = NULL;
 
        if (pList != NULL)
        {
            pTail->next = pNode;
            pTail = pNode;
        }
 
        else
        {
            pList = pNode;
            pHead = pTail = pList;
        }
    }
 
    pTail->next = pList;
 
    printf("\n\n");
 
    bool found = false;
    while (pList != NULL && !found)
    {
        if (pList->n_val < 0)
        {
            found = true;
            if (pList->prev != NULL)
                pList->prev->next = pList->next;
            else {
                pList->next->prev = NULL;
                pTail->next = pList->next;
            }
        
            if (pList->next != NULL)
                pList->next->prev = pList->prev;
            else {
                pList->prev->next = pTail;
            }
 
            pList = pList->next;
        }
 
        else pList = pList->next;
    }
 
    int n = 0;
    while (pList != NULL)
    {
        printf("n_val[%d] = %d\n", n, pList->n_val);
        _getch();
        
        pList = pList->next;
        n++;
    }
 
    return 0;
}
0
0 / 0 / 0
Регистрация: 06.03.2017
Сообщений: 11
07.03.2017, 16:53  [ТС]
все равно реализация не такая, очень все за мудрено написано( , но все равно спасибо, старались, писали.
0
0 / 0 / 0
Регистрация: 06.03.2017
Сообщений: 11
13.03.2017, 07:18  [ТС]
маленький недочет в поиске отрицательного элемента, не могу исправить, помогите пожалуйста!


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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include "StdAfx.h"
#include <iostream>
#include < conio.h >
 
using namespace std;
struct node
{
  int elem;
  node *sled;
  node *pred;
};
 
class Spisok
{
  private:
    node *nd;//Указатель на начало дека.
    node *kd;//Указатель на конец  дека.
    int klad;//Информационное поле удаленного элемента.
  public:
    void BuiltDeck ();
    void VyvodDeck ();
    void Poisk();
    void DelLeft(node*Res);
    void Ochistka();
};
 
void main ()
{ setlocale(LC_ALL,"RUS");
 
  Spisok A;
 
  A.BuiltDeck ();
  cout<< "До удаления: \n" ; 
  A.VyvodDeck ();
  A.Poisk();
  cout<< "После удаления: \n" ; 
   A.VyvodDeck ();
    getch (); 
  A.Ochistka();
}
 
void Spisok::BuiltDeck ()
// Построение дека на базе двунаправленного
// списка с заглавным звеном.
// nd - указатель на начало дека,
// *kd - указатель на конец дека.
{
  node *q;
  node *z;
  int  el;
 
  nd = new(node);
  z = nd;
  (*nd).pred = (*nd).sled = NULL;
  cout<<"Введите последовательность: \n";
  cin>>el;
  while  (el!=0)
  { (*z).sled = new (node);
    (*((*z).sled)).pred = z;
    z = (*z).sled; (*z).sled = NULL;
    (*z).elem = el; cin>>el;}
    if  ((*nd).sled!=NULL)
      { q = nd; nd = (*nd).sled; (*nd).pred = NULL;
        kd = z; delete q; }
    else 
      { delete nd; nd = kd = NULL; }
}
 
void Spisok::VyvodDeck ()
// Вывод содержимого дека.
// nd - указатель на начало дека.
{
  node *z;
 
  z = nd; cout<<"Содержимое дека: ";
  if  (z!=NULL)
    while  (z!=NULL)
     { cout<<(*z).elem<<" "; z = (*z).sled; }
  else  cout<<"он пуст!\n";
  cout<<endl;
}
 
void Spisok::Poisk()
    // поиск отрицательного элемента
{ node *p;
 
 p=(*nd).sled;
 
while (p!=nd && (*p).elem >= 0)
 {
     p=(*p).sled;
 }
 
 if (p!=nd)
     DelLeft (p);
 
}
 
void Spisok::DelLeft(node*Res)
// Удаление звена из дека слева с помещением
// элемента удаляемого звена в переменную klad.
// nd - указатель на начало дека,
{node *p;
  if  ((*nd).sled!=NULL)
    { p = nd; klad =(*p).elem;
      nd = (*nd).sled; (*nd).pred = NULL; delete p; }
  else
    { // В деке находится один элемент.
      p = nd; klad =(*p).elem;
      nd = kd = NULL; delete p;cout<<"Дек пуст!\n"; 
    }
}
 
void Spisok::Ochistka()
{
  node *q,*q1;
 
  q = nd;
  q1 = (*q).sled;
  while (q1!=NULL)
    { delete q; q = q1; q1 = (*q).sled;}
  delete q;
  nd = kd = NULL;
}
0
0 / 0 / 0
Регистрация: 06.03.2017
Сообщений: 11
27.03.2017, 08:44  [ТС]
задача решена, спасибо за помощь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.03.2017, 08:44
Помогаю со студенческими работами здесь

Реализация двунаправленных списков в компьютере
Привет, ув. форумчане. Необходима помощь в реализации задачи &quot;получение значения текущего элемента&quot; по указанной в &quot;шапке&quot;...

Реализация двунаправленных списков в компьютере
Задание: 1. инициализация списка: присвоение текущему, начальному и конечному указателю неопределенного значения; 2. помещение в список...

Кольцевые списки
Здравствуйте, как реализовать удаление в кольцевом списке ? Читал, что можно сделать так, чтобы при удалении элементы не смещались, а...

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

Двунаправленные кольцевые списки
Здравствуйте, уважаемые форумчане! Нужна помощь в доработке Двунаправленного кольцевого списка Delphi. Коды взяти с предыдуших тем...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru