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

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

Войти
Регистрация
Восстановить пароль
 
KDG94
0 / 0 / 0
Регистрация: 10.12.2013
Сообщений: 32
#1

Цикические однсвязные списки - C++

24.12.2013, 18:55. Просмотров 216. Ответов 4
Метки нет (Все метки)

Всем доброго времени суток. Очень нужна ваша помощь. Дана задачка. Немного не получается удаление элементов. Прогу писал в вижуал с++. Прилагаю код.
N ребят располагаются по кругу. (задать в качестве элементов списка имена). Начав отсчет от первого, удаляют согласно считалке каждого j-го, смыкая при этим круг. Определить порядок удаления ребят из круга, выводя на экран имя и порядковый номер удаляемого. Выполнить ввод данных с клавиатуры, организовав циклический список. Предусмотреть ввод текста считалки, после чего подсчитывается число слов в ней (j).
Все работает, кроме удаления... Передвигаться по списку можно только вперед, tmp->prew использовать нельзя
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
#include "stdafx.h"
#include<iostream>
#include<conio.h>
#include<string.h>
#include<locale>
#include<iomanip>
#include<stdlib.h>
using namespace std;
 
class List
 { public:
struct dlist
{
 char x[10];
 int nomer;
 dlist *Next;
};
   dlist *Head,*Tail;
   int size; //кол-во элементов в списке
  
       List():Head(NULL),Tail(NULL),size(0){}; //обнулил
       void Add(char x[10], int nomer); 
       void Show();
    //   void del(int pos);
 };
 
void List::Add(char x[10], int nomer)
  {
      size++; 
      dlist  *temp=new dlist; 
      temp->Next=Head; //последний элемент - это начало списка 
      strcpy(temp->x,x); //Записываем
      temp->nomer=nomer;
      if (Head!=NULL) //В том случае если список не пустой
         {
            Tail->Next=temp; //Запись данных в следующее за последним элементом поле
            Tail=temp; //Последний активный элемент=только что созданный.
         }
               else 
                   Head=Tail=temp;//Если список пуст то создается первый элемент.
      temp->nomer=size;
}
 
void List::Show()
 {
    int i=size;
    if(Head==NULL)
        {
             cout<<"Список пуст"<<endl;
             return;
        }
    dlist* tmp = Head;
    cout<<"Вывод: "<<endl;
    while(i!=0)
      {
          cout<<"Имя: "<<tmp->x<<"  Номер: "<<tmp->nomer<<endl;
          tmp=tmp->Next;
          i--;
      }
 }
 
int _tmain(int argc, _TCHAR* argv[])
{
    List l;
    char ch,x[10], ss[100][12]; 
    int i,j,N,R=0,k;
    setlocale(LC_ALL,"Russian");
    cout<<"Введите количество детей: ";
    cin>>N;
    cout<<endl;
    for (i=0;i<N;i++)
        {
            cout<<"ИМЯ РЕБЕНКА: "<<endl;
            cin>>x;
            l.Add(x,i);
        }
    l.Show();
    //====== ЭТОТ КУСОК ПРОГРАММЫ ВВОДИТ И ВЫВОДИТ СЧИТАЛКУ И КОЛИЧЕСТВО СЛОВ НЕЙ =====
    cout<<"Введите считалку до 100 слов (в конце через пробел поставьте #): \n";
    j=0;
    while(1)
      {
         cin.get(ch);
         if(ch=='#') 
             break;
         i=0;
         while(ch!=' ')
            {
               ss[j][i++]=ch;
               cin.get(ch);
            }
         ss[j][i]='\0';
         j++;
       }
     cout<<"Количество слов: "<<j<<endl;
//=======================================================
    i=l.size;k=0;
    List::  dlist* tmp =  l.Head;
    List::  dlist* temp = tmp->Next;
    while(i!=0)//пока не кончатся дети
      { 
        for(k=1;k<j;k++) //пока не прошли все сова в считалке
           {
               tmp=tmp->Next; // двигаемся вперед и выбираем УДАЛЯЕМЫЙ ЭЕМЕНТ
               temp=tmp->Next;      //след. за удаляемым
           }
           cout<<"Удаляю: "<<endl<<"Имя: "<<tmp->x<<" Номер: "<<tmp->nomer<<endl;//вывод что удаляем
           delete tmp;
           tmp=temp;//переходим на следующий после удаленного
          
        i--;
      } 
//=================================================================================
    system("pause");
    return 0;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.12.2013, 18:55
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Цикические однсвязные списки (C++):

Списки, как склеить списки между собой? - C++
Ребят, привет всем, есть код, в классе которого описаны несколько методов: добавление элемента в список, удаление и просмотр списка, дак...

Списки, списки, списки. не все так просто - Python
Написать функцию, которая принимает 2 списка, содержащие одинаковое число строк, затем изменяет списки сопоставляя строки, занимающие...

Список женихов и невест. Обьеденить списки в списки пар. - C++ Builder
Имеется список женихов и невест. каждая запись списка содержит пол, имя, возраст, рост, вес, а также требуванию к партнеру: наименьший и...

Как преобразовать вложенные списки из строки в обычные списки? - Python
Доброе утро, форумчане. Подскажите пожалуйста, мне нужно написать скрипт, который разбирает строку на список вложенный друг в друга....

Дан вектор, элементы которого списки из целых чисел.Заменить на NILL списки с суммой равной 0 - Lisp
Дан вектор, элементы которого списки из целых чисел.Заменить на NILL списки с суммой равной 0.

Даны списки чисел, нужно вывести список всех возможных комбинаций чисел, составляющих эти списки - Python
Даны списки чисел, нужно вывести список всех возможных комбинаций чисел, составляющих эти списки (элемент из списка 1, элемент из списка 2...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
monolit
185 / 184 / 22
Регистрация: 24.03.2011
Сообщений: 667
Завершенные тесты: 1
24.12.2013, 19:47 #2
Цитата Сообщение от KDG94 Посмотреть сообщение
tmp=temp;//переходим на следующий после удаленного
А ссылку с предыдущего удаляемому на этот ты переставить забыл. Хотя мож у тебя там как-то по другому, не рассматривал особо...
Примерно так должно быть:
C++
1
2
3
4
5
6
7
8
9
10
11
    List::  dlist* cur=  l.Head;
    List::  dlist* prev;
    for(k=1;k<j;k++) //пока не прошли все сова в считалке
           {
               prev = cur;
               cur = cur->Next;
           }
           // //вывод что удаляем
           prev->next = cur->next;
           delete cur;
           cur = prev->next;
Могу ошибиться на +/- 1 элемент, но тут ты сам смотри уже... Ну и если в списке элементов не хватает, тоже наверное стоит обыграть как-то.
0
KDG94
0 / 0 / 0
Регистрация: 10.12.2013
Сообщений: 32
24.12.2013, 20:31  [ТС] #3
Цитата Сообщение от monolit Посмотреть сообщение
А ссылку с предыдущего удаляемому на этот ты переставить забыл. Хотя мож у тебя там как-то по другому, не рассматривал особо...
Примерно так должно быть:
C++
1
2
3
4
5
6
7
8
9
10
11
    List::  dlist* cur=  l.Head;
    List::  dlist* prev;
    for(k=1;k<j;k++) //пока не прошли все сова в считалке
           {
               prev = cur;
               cur = cur->Next;
           }
           // //вывод что удаляем
           prev->next = cur->next;
           delete cur;
           cur = prev->next;
Могу ошибиться на +/- 1 элемент, но тут ты сам смотри уже... Ну и если в списке элементов не хватает, тоже наверное стоит обыграть как-то.
В том то и проблема, что при работе со списком нельзя обращаться к предыдущему элементу, поэтому такой код не пройдет
0
monolit
185 / 184 / 22
Регистрация: 24.03.2011
Сообщений: 667
Завершенные тесты: 1
24.12.2013, 20:48 #4
Ну ты к нему и не обращаешься - список то односвязный. Ты его хранишь в отдельной переменной. А иначе никак) Ну или уж совсем извращения, о которых говорить не хочется.
1
KDG94
0 / 0 / 0
Регистрация: 10.12.2013
Сообщений: 32
24.12.2013, 21:00  [ТС] #5
Спасибо, попробую реализовать)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.12.2013, 21:00
Привет! Вот еще темы с ответами:

Ассоциативные списки и списки свойств - Lisp
Не могу разобраться в теме &quot;Ассоциативные списки и списки свойств&quot;,а именно как работать с ключами)если кому не сложно,объясните...

Линейные списки и циклические списки - Pascal
Подскажите,кто как может,у меня тут 2 лабы,с чего мне начать,где можно материал взять?? 1-ая лабораторная: Линейные списки ...

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

Списки. - Pascal
СДелать список с произвольных доступом(Стек,очередь,дек) в который должны входить основные действия над эл.списка. 1)Создание пустого...


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

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

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