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

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

Восстановить пароль Регистрация
 
KyKi
3 / 3 / 0
Регистрация: 12.09.2013
Сообщений: 129
09.02.2014, 21:00     Сформировать односвязный кольцевой линейный список по файлу целых чисел #1
Помогите пожалуйста,разобраться..для меня тема новая,не очень понимаю как написать код к заданию:
Сформировать односвязный кольцевой линейный список по файлу целых чисел. Обработать список, удаляя в нем последовательно 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++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
НеСказочник
58 / 46 / 7
Регистрация: 12.11.2012
Сообщений: 339
Записей в блоге: 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
Сообщений: 129
10.02.2014, 14:44  [ТС]     Сформировать односвязный кольцевой линейный список по файлу целых чисел #3
НеСказочник, дело в том,что это мне нужно сделать именно без класса..А про х спасибо,изменила. Меня больше интересует часть где про удаление n-ого числа. Не могли бы вы подсказать,как это можно сделать?
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 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
Сообщений: 129
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();
    }
}
Yandex
Объявления
11.02.2014, 14:43     Сформировать односвязный кольцевой линейный список по файлу целых чисел
Ответ Создать тему
Опции темы

Текущее время: 23:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru