Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
4 / 4 / 1
Регистрация: 12.09.2013
Сообщений: 134
1

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

09.02.2014, 21:00. Просмотров 2979. Ответов 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();
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.02.2014, 21:00
Ответы с готовыми решениями:

Создать односвязный кольцевой линейный список элементы которого целые числа
Создать односвязный кольцевой линейный список элементы которого целые числа. Удалить каждый 3...

Разработать алгоритм и программу решения задачи, в которой сформировать кольцевой односвязный список.
Разработать алгоритм и программу решения задачи, в которой сформировать кольцевой односвязный...

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

Кольцевой список на основе массива целых чисел x[1] ... x[n]
Массив целых чисел x ... x использовать для формирования кольцевого списка и организовать...

4
59 / 47 / 13
Регистрация: 12.11.2012
Сообщений: 373
Записей в блоге: 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. и элемент будет пропущен в списке. (только не забудьте разобраться с памятью выделенной под удалённый элемент)
0
4 / 4 / 1
Регистрация: 12.09.2013
Сообщений: 134
10.02.2014, 14:44  [ТС] 3
НеСказочник, дело в том,что это мне нужно сделать именно без класса..А про х спасибо,изменила. Меня больше интересует часть где про удаление n-ого числа. Не могли бы вы подсказать,как это можно сделать?
0
Эксперт С++
1918 / 1260 / 360
Регистрация: 16.05.2013
Сообщений: 3,293
Записей в блоге: 6
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;
    }
}
1
4 / 4 / 1
Регистрация: 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();
    }
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.02.2014, 14:43

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Односвязный список из последовательности целых чисел
написать программу которая из последовательности целых чисел формирует односвязный список.в списке...

Создать линейный односвязный список из вещественных чисел. Удалить из списка элемент перед каждым элементом со значен
Создать линейный односвязный список из вещественных чисел. Удалить из списка элемент перед каждым...

Односвязный кольцевой список
Подскажите, как изменить данный код, что бы список стал кольцевым? #include &lt;iostream&gt; #include...

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

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