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

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

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

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

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

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

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

Списки - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; struct list { int data; list *next; }; int...

списки - C++
напишите теорию о списках

списки С++ - C++
необходимо создать очередь(итеративный метод) с постановкой эл-ов в начало списка помогите плизз!!!! заранее спасибо:)

Списки в С++ - C++
С(40) Создать класс в котором нужно подсчитать минимальный елемент массива С і его номер. Заранее благодарю!!! вот я накинул, но она не...

Списки!!! - C++
Помогите ПЛИЗЗЗ!!! И если можно добавьте комментарии к каждой строке!!!:) Добавить новый элемент после заданного; элемент задан...

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

Списки С++ - C++
Пусть в файле хранятся записи со сведениями об автомобилях и их владельцах (марка, номер ГАИ, фамилия владельца); Необходимо: а) для...

C++ списки - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;list&gt; using namespace std; int main(void) { list&lt; int &gt; l,...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
monolit
185 / 184 / 22
Регистрация: 24.03.2011
Сообщений: 665
Завершенные тесты: 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 элемент, но тут ты сам смотри уже... Ну и если в списке элементов не хватает, тоже наверное стоит обыграть как-то.
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 элемент, но тут ты сам смотри уже... Ну и если в списке элементов не хватает, тоже наверное стоит обыграть как-то.
В том то и проблема, что при работе со списком нельзя обращаться к предыдущему элементу, поэтому такой код не пройдет
monolit
185 / 184 / 22
Регистрация: 24.03.2011
Сообщений: 665
Завершенные тесты: 1
24.12.2013, 20:48     Цикические однсвязные списки #4
Ну ты к нему и не обращаешься - список то односвязный. Ты его хранишь в отдельной переменной. А иначе никак) Ну или уж совсем извращения, о которых говорить не хочется.
KDG94
0 / 0 / 0
Регистрация: 10.12.2013
Сообщений: 32
24.12.2013, 21:00  [ТС]     Цикические однсвязные списки #5
Спасибо, попробую реализовать)
Yandex
Объявления
24.12.2013, 21:00     Цикические однсвязные списки
Ответ Создать тему
Опции темы

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