Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <math.h>
- int read_number(double* value, const char* prompt, int size_buf, const char* mode);
- using namespace std;
- class List {
- private:
- struct Node {
- int a;
- int b;
- Node* next;
- };
- Node* start; //указатель на первый элемент списка
- Node* p;
- //указатель на текущий элемент списка
- public:
- List(int a = 0, int b = 0);// конструктор класса
- ~List();// деструктор класса
- void add(int a, int b);//добавить элемент
- void remove();// удалить элемент
- void show();// показать значение полей
- void change(int a, int b);//поменять значения полей
- void begin();// переместить в начало списка
- void step();//переместить указатель на один элемент вправо
- void showall();//показать весь список
- int find();//поиск элемента
- };
- void List::add(int a, int b) {
- Node* B = new Node;
- B->a = a;
- B->b = b;
- B->next = p->next;
- p->next = B;
- };
- void List::remove() {
- Node* p0 = start;
- if (p0 == p) {
- p0 = p0->next;
- delete p;
- p = p0;
- start = p;
- }
- else {
- while (p0->next != p) p0 = p0->next;
- p0->next = p->next;
- delete p;
- p = p0;
- }
- };
- void List::show() {
- cout << endl << "(" << p->a << ", " << p->b << "); ";
- };
- void List::change(int a, int b) {
- p->a = a;
- p->b = b;
- };
- void List::step() {
- if (p->next != NULL)
- p = p->next;
- };
- void List::showall() {
- Node* p0 = start;
- cout << endl << "Все элементы: ";
- while (p0 != NULL) {
- if (p0 == p) {
- cout << "[" << p0->a << ", " << p0->b << "] ";
- }
- else
- cout << "(" << p0->a << ", " << p0->b << ") ";
- p0 = p0->next;
- }
- cout << endl;
- };
- int List::find(){
- bool isExist = false;
- int a, b;
- Node* p0 = start;
- Node* last = new Node;
- do {
- a = p0->a;
- b = p0->b;
- if ((a=0) & (b!=0)) {
- last = p0;
- isExist = true;
- }
- p0 = p0->next;
- } while (p0 != NULL);
- if (isExist) {
- p = last;
- return 0;
- }
- else return 1;
- };
- List::List(int a, int b) {
- Node* B = new Node;
- B->a = a;
- B->b = b;
- B->next = NULL;
- start = B;
- p = B;
- };
- List::~List() {
- p = start;
- while (p->next != NULL)
- p = p->next;
- while (p != start)
- List::remove();
- delete start;
- }
- void main_add(List* list) {
- double a, b;
- int status = 0;
- cout << endl;
- do {
- status = read_number(&a, "Введите параметр 'а'", 8, "int");
- if (status != 0) cout << "Попробуйте ещё раз." << endl;
- } while (status != 0);
- do {
- status = read_number(&b, "Введите параметр 'b'", 8, "int");
- if (status != 0) cout << "Попробуйте ещё раз." << endl;
- } while (status != 0);
- list->add(a, b);
- }
- void main_change(List* list) {
- double a, b;
- int status = 0;
- cout << endl;
- do {
- status = read_number(&a, "Введите параметр 'а' первого элемента", 8, "int");
- if (status != 0) cout << "Попробуйте ещё раз." << endl;
- } while (status != 0);
- do {
- status = read_number(&b, "Введите параметр 'b' первого элемента", 8, "int");
- if (status != 0) cout << "Попробуйте ещё раз." << endl;
- } while (status != 0);
- list->change(a, b);
- }
- void List::begin() {
- p = start;
- };
- void main_find(List* list) {
- if (list->find() == 0) {
- cout << endl << "Найденный элемент:" << endl;
- list->show();
- cout << endl;
- }
- else {
- cout << endl << "Элементов, для которых a=0 & b!=0, в списке нет." << endl;
- }
- }
- int read_number(double* value, const char* prompt, int size_buf, const char* mode) {
- using namespace std;
- size_t length = 0;
- char* end = NULL;
- char* buf = (char*)malloc(size_buf * sizeof(char));
- cout << prompt << ": ";
- cin.getline(buf, size_buf + 1);
- if (!cin) {
- cin.clear();
- while (cin.get() != '\n');
- cout << endl << "Ошибка: не вводите больше чем " << size_buf << " символа(ов)." << endl;
- return 1;
- }
- int tt = (strchr(buf, '\n') - buf) + 1;
- if (tt <= size_buf + 1) {
- double i, f = 0, tmp_d;
- errno = 0;
- if (mode == "int") {
- tmp_d = strtod(buf, &end);
- f = modf(tmp_d, &i);
- *value = i;
- }
- if (mode == "double") {
- *value = strtod(buf, &end);
- }
- if (strlen(buf) == 0) {
- cout << endl << "Ошибка: введена пустая строка." << endl;
- return 1;
- }
- if (errno != 0 || *end != '\0') {
- cout << endl << "Ошибка: некорректный символ." << endl;
- cout << "\t" << buf << endl;
- printf("\t%*c\n",(int)(end - buf) + 1, '^');
- return 1;
- }
- if (f > 0) {
- cout << endl << "Ошибка: введите целое число." << endl;
- return 1;
- }
- }
- return 0;
- }
- int main(){
- int status=0;
- double a, b;
- double key = 0;
- do {
- status = read_number(&a, "Введите параметр 'а' первого элемента", 8, "int");
- if (status != 0) cout << "Попробуйте ещё раз." << endl;
- } while (status != 0);
- do {
- status = read_number(&b, "Введите параметр 'b' первого элемента", 8, "int");
- if (status != 0) cout << "Попробуйте ещё раз." << endl;
- } while (status != 0);
- List list(a, b);
- while (key != 9) {
- cout << endl;
- cout << "1.Добавить элемент." << endl;
- cout << "2.Удалить элемент." << endl;
- cout << "3.Показать значения полей текущего элемента." << endl;
- cout << "4.Поменять значения полей текущего элемента." << endl;
- cout << "5.Перейти к первому элементу списка." << endl;
- cout << "6.Перейти к следующему элементу списка." << endl;
- cout << "7.Вывести все элементы списка." << endl;
- cout << "8.Найти последний элемент для которого выполняется a=0 и b!=0." << endl;
- cout << "9.Выход из программы." << endl;
- do {
- status = read_number(&key, "Выберите операцию", 1, "int");
- if(status != 0) cout << "Попробуйте ещё раз." << endl;
- }
- while (status != 0);
- switch ((int)key) {
- case 1:
- cout <<endl;
- cout << "Добавляем элемент..." << endl;
- main_add(&list);
- break;
- case 2:
- cout <<endl;
- cout << "Удаляем элемент..." << endl;
- list.remove();
- break;
- case 3:
- cout <<endl;
- cout << "Показываем значение полей..." << endl;
- list.show();
- break;
- case 4:
- cout <<endl;
- cout << "Меняем значения полей..." << endl;
- main_change(&list);
- break;
- case 5:
- cout <<endl;
- cout << "Перемещаем в начало списка..." << endl;
- list.begin();
- break;
- case 6:
- cout <<endl;
- cout << "Перемещаем указатель на один элемент вправо..." << endl;
- list.step();
- break;
- case 7:
- cout <<endl;
- cout << "Показываем весь список..." << endl;
- list.showall();
- break;
- case 8:
- cout <<endl;
- cout<<"Находим элемент для котрого выполняется a=0 и b!=0..."<<endl;
- main_find(&list);
- break;
- case 9:
- cout <<endl;
- cout << "Выход из программы..." << endl;
- exit(EXIT_SUCCESS);
- break;
- default:
- cerr << "Вы выбрали неверный вариант" << endl;
- exit(EXIT_FAILURE);
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement