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

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

Войти
Регистрация
Восстановить пароль
 
KyKi
3 / 3 / 0
Регистрация: 12.09.2013
Сообщений: 134
#1

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

09.02.2014, 21:00. Просмотров 1144. Ответов 4
Метки нет (Все метки)

Помогите пожалуйста,разобраться..для меня тема новая,не очень понимаю как написать код к заданию:
Сформировать односвязный кольцевой линейный список по файлу целых чисел. Обработать список, удаляя в нем последовательно n-й элемент, пока не останется один элемент (после удаления отсчет начинается со следующего элемента), n ввести с клавиатуры. Информацию всех удаляемых узлов выводить на экран. Если удаляется узел – голова списка, сделать головой следующий за ним узел.
Вот безрезультатные попытки разобраться с кодом,особенно интересует удаление:
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
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
 
struct List
{
    int data;       //информационное поле, данные, любой порядковый тип
    List *next;    //указатель на следующий элемент
};
typedef List *pList;  //ссылка на структуру
//--------------------------------------------------------------------------------------------------
void Add_last(pList&q, int a, pList first) //q-показатель на последний
{
    pList p;
    p=new List;
    p->data=a;
    p->next=first;
    q->next=p;
    q=p;
}
 
void Insert_after_q(pList&q, int a)
{
    pList p;
    p=new List;     //выделение области памяти
    p->data = a;    //заполнение информационного поля
    p->next = q->next;
    q->next = p;        //наведение связей
}   
 
 
    //--------------------------------------------------------------------------------------------------
    void CreateFile(fstream &fout, char *namefile)  //функция создания файла
{
    int x;
    fout.open(namefile, ios::binary|ios::out);  //открытие файла file
    if (!fout.is_open())
    {
        cout << "Ошибка,"<<namefile<< "файл не открыт." << endl;
    }
    else
    {
        cout << "Введите данные в файл. Для окончания ввода введите *:" << endl;
        cin>>x;
        while (x!='*')
        {
            fout.write((char*)&x, sizeof x);
            cin >>x;
        }
    }
    fout.close();       //закрыть файл
}
 
void ReadFile(fstream &fin, char *namefile)
{
    int x;
    fin.open(namefile, ios::binary|ios::in);
    if (!fin.is_open())
    {
        cout << "Ошибка,"<<namefile<< "файл не открыт." << endl;
    }
    else
    {
        while (fin.read((char*)&x, sizeof x))
        {
            cout<<x<<", ";
        }
        fin.close();
    }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.02.2014, 21:00
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сформировать односвязный кольцевой линейный список по файлу целых чисел (C++):

Создать однонаправленный кольцевой список целых чисел - C++
Помогите написать программу (СРОЧНО)!!! Тип списка:Однонаправленный кольцевой Элемент списка: целое Создать список из...

Кольцевой односвязный список - C++
Собственно что это и с чем его едят! Как реализовать, если это что-то страшное! Задача : сделать класс реализующий односвязный...

Кольцевой односвязный список - C++
Реализовал класс для работы со списком студентов( использовал кольцевой односвязный список). Для навигации по классу используется...

Односвязный кольцевой список - C++
Односвязный кольцевой список. в качестве аргумента передается значение value. Если оно есть в списке, необходимо вместо первого...

Кольцевой односвязный список - C++
Есть список программа удаляет добавляет редактирует сортирует есть поиск но если сначала добавить потом еще добавить потом редактировать...

Кольцевой односвязный список - C++
Доброго времени суток, требуется помощь в создании односвязного кольцевого списка. смог только этот быдлокод: struct stud { ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
НеСказочник
58 / 46 / 7
Регистрация: 12.11.2012
Сообщений: 344
Записей в блоге: 2
10.02.2014, 02:11 #2
Методы работы со списком, вроде бы, правильные и должны работать, хотя я бы посоветовал поместить их всех (включая удаление и прочее) в отдельный класс, который будет хранить указатель на последний элемент, на первый и вообще все необходимое.

А вот с методами работающими с файлом проблема. Вы определитесь какого типа у Вас x. Если int, то где именно в множестве целых чисел Вы видели "*", а если char*, то нужно определиться с форматом файла. В текстовый файл можно писать и char*, а вот для бинарного придётся, сначала, преобразовать char* в int при помощи метода atoi или sscanf.

PS: доведите класс списка до ума (пока там всё правильно, просто бардак немного). И определитесь с форматом файла и типом переменной x. И всё заработает.

Добавлено через 4 минуты
Удаление делается просто. нужен указатель на элемент перед удаляемым. т.е. проходитесь от первого в стиле p = p->next, пока p->next не станет равно удаляемому элементу. И тогда просто пишите p->next=p->next->next. и элемент будет пропущен в списке. (только не забудьте разобраться с памятью выделенной под удалённый элемент)
KyKi
3 / 3 / 0
Регистрация: 12.09.2013
Сообщений: 134
10.02.2014, 14:44  [ТС] #3
НеСказочник, дело в том,что это мне нужно сделать именно без класса..А про х спасибо,изменила. Меня больше интересует часть где про удаление n-ого числа. Не могли бы вы подсказать,как это можно сделать?
Ilot
Модератор
Эксперт С++
1809 / 1166 / 227
Регистрация: 16.05.2013
Сообщений: 3,071
Записей в блоге: 5
Завершенные тесты: 1
10.02.2014, 15:25 #4
Вам нужно хранить два указателя - на текущий и на предыдущий элемент. Например, имеем метод принимающий n - порядковый номер удаляемого элемента:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void List::RemoveElement (int n)
{
    List *prev,             //предыдущий элемент
         *current = head;   //текущий элемент
    /**  
     *   процедура удаления n-го элемента
     */                                                           
    while(current->next != current) {    //пока не останется один элемент в списке
        int count = n;
        while(--count) {
                prev = current;
                current = current->next;
        }
        prev->next = current->next;
        prev = prev->next;
        std::cout << "Удаляется элемент со значением " << current->data << std::endl;
        delete current;
        current = prev;
    }
}
KyKi
3 / 3 / 0
Регистрация: 12.09.2013
Сообщений: 134
11.02.2014, 14:43  [ТС] #5
Вот у меня вышло такое безобразие,подскажите пожалуйста,что не так
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
132
133
struct List
{
    int data;       //информационное поле, данные, любой порядковый тип
    List *next;    //указатель на следующий элемент
};
typedef List *pList;  //ссылка на структуру
void main()
{
    setlocale(LC_ALL, "Russian");
    fstream fout,fin,finout;
    pList first, last,q;
    char namefile[30],c;
    int x,n;
    do{
    cout << "Введите название файла: ";
    cin >> namefile;
    cout << endl;
    CreateFile(fout,namefile);
    ReadFile(fin,namefile);
    Create_list (finout, namefile, first,last);
    Read_list(first);
    cout<<"\n Введите х:"<<endl;
    cin>>x;
    cout<<"\n Введите № элемента который будет удаляться последовательно:"<<endl;
    cin>>n;
    Del(q,first,n);
    cout<<"\n Если хотите повторить программу нажмите Y:"<<endl;
    cin>>c;
    }while(c=='Y');
}
    
//--------------------------------------------------------------------------------------------------
void Create_list(fstream &finout, char *namefile, pList &first, pList &last)
{
    int a;
    pList q;
    finout.open(namefile, ios::in | ios::binary);
    if (! finout.is_open())
    {
        cout<<"Ошибка,"<<namefile<< "файл не открыт."; exit(1);
    }
    first = nullptr;            //вначале список пуст
    finout.clear();
    while (finout.read((char *) &a, sizeof a))  
    {
        if  (first == nullptr) 
        { 
            Add_last(q, a,first);
            last = first;
        }
        else Add_last(q, a,first);
    }
    finout.close();
}
 
void Read_list(pList first)
{
    pList p;
    p = first;
    while (p)   //пока указатель на следующий не пуст
    {
        cout<<p -> data<<" ";
        p = p->next;        //установить на следующий
    }
}
 
void Add_last(pList&q, int a, pList first) //q-показатель на последний
{
    pList p;
    p=new List;
    p->data=a;
    p->next=first;
    q->next=p;
    q=p;
}
 
void Del(pList&q, pList first, int n)
{
pList p;
p=first;
while(p->next!=p)
{
    while(n--)
    {
        q=p;
        p=p->next;
    }
    q->next=p->next;
    q=q->next;
    cout<<"\n Удаляемый элемент:"<<p->data<<endl;
    delete p;
    p=q;
}
}
//--------------------------------------------------------------------------------------------------
void CreateFile(fstream &fout, char *namefile)  //функция создания файла
{
    int x;
    fout.open(namefile, ios::binary|ios::out);  //открытие файла file
    if (!fout.is_open())
    {
        cout << "Ошибка,"<<namefile<< "файл не открыт." << endl;
    }
    else
    {
        cout << "Введите данные в файл. Для окончания ввода введите 1111:" << endl;
        cin>>x;
        while (x!=1111)
        {
            fout.write((char*)&x, sizeof x);
            cin >>x;
        }
    }
    fout.close();       //закрыть файл
}
 
void ReadFile(fstream &fin, char *namefile)
{
    int x;
    fin.open(namefile, ios::binary|ios::in);
    if (!fin.is_open())
    {
        cout << "Ошибка,"<<namefile<< "файл не открыт." << endl;
    }
    else
    {
        while (fin.read((char*)&x, sizeof x))
        {
            cout<<x<<", ";
        }
        fin.close();
    }
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.02.2014, 14:43
Привет! Вот еще темы с ответами:

Кольцевой односвязный список, сортировка - C++
Помогите, пожалуйста, с сортировкой списка. #include &lt;iostream&gt; #include &lt;stdlib.h&gt; using namespace std; struct Node { int...

Односвязный кольцевой список, реализовать - C++
Помогите написать и реализовать кольцевой список

Линейный список из целых чисел - C++
Дан линейный список, который состоит из целых чисел. Нужно к каждому элементу списка прибавить значение последнего элемента. struct...

Кольцевой односвязный список, удалить из него все отрицательные числа - C++
Здравствуйте, необходимо решить проблему в задаче: &quot;Сформулируйте кольцевой список с вещественным информационным полем и удалите из него...


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

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

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