Хранение данных в двусвязном списке - PullRequest
0 голосов
/ 29 мая 2020

Мне нужно создать двусвязный список, в котором хранятся разные типы данных.

Я не могу ввести несколько слов через консоль через пробел в одной строке, чтобы они были записаны в одну переменную. Я пробовал использовать cin.getline(book.plant, 50);, но он работает некорректно

И не могу сделать функцию удаления. Я хочу создать функцию, которая удаляет строку, в которой первый элемент равен введенному мной. Каждый раз, когда я запускаю код, он показывает мне: такого элемента нет.

Вот мой код:

#include <iostream>
#include <list>
#include <locale>
#include <cstdlib>
#include <stdlib.h>
#include <list>

using namespace std;
typedef struct  // создание узла двусвязного списка
{
    char plant[50];
    char family[50];
    char species[50];  //вид
    char sort[50];     //род
    char purpose[50];   //призначення
    char territory[50];    //територія зростання
    //char map[50];       // карта обліку
    char compatibility[50];   //сумістність зіншими видами
}BOOK;

typedef struct tag_obj 
{
    BOOK b;
    struct tag_obj* prev, * next;
}OBJ;

OBJ* head = NULL, * tail = NULL;

void add_obj(OBJ* obj, BOOK book) {

    OBJ* ptr = new OBJ;

    ptr->b = book;
    ptr->prev = obj;
    ptr->next = (obj == NULL) ? NULL : obj->next;

    if (obj != NULL) {
        obj->next = ptr;
        if (obj->next != NULL) obj->next->prev = ptr;
    }
    if (ptr->prev == NULL) head = ptr;
    if (ptr->next == NULL) tail = ptr;
}

void del_obj(OBJ* obj) {
    char x[50];
    cout << "enter the name of the plant whose data you want to delete: ";
    cin >> x;
    OBJ* tmp;
    OBJ* h;

    if (head == NULL) // емли нет не одного узла, то возращаемся
    {
        cout << "List empty,nothing to delete" << endl;
        return;
    }
    if (head->b.plant == x)     //удаляем первый елемент
    {
        tmp = head;
        head = head->next;  // теперь голова -это следующий елемент
        head->prev = NULL;   // предыдущего не существует
        cout << "Element Deleted" << endl;
        free(tmp);
        return;
    }
    h = head;
    while (h->next->next != NULL)
    {

        if (h->next->b.plant == x)    // удаляем елемент после
        {
            tmp = h->next;
            h->next = tmp->next;
            tmp->next->prev = h;
            cout << "Element Deleted" << endl;
            free(tmp);
            return;
        }
        h = h->next;
    }
    if (h->next->b.plant == x) // удаление последнего елемента
    {
        tmp = h->next;
        free(tmp);
        h->next = NULL;      //следующего не существует
        cout << "Element Deleted" << endl;
        return;
    }
    cout << "Element " << x << " not found" << endl;



}


void show() {
    OBJ* c = head;
    while (c != NULL) {
        cout << c->b.plant << "  " << c->b.family << "  " << c->b.species << "  " << c->b.sort << "  " << c->b.purpose << "  " << c->b.territory << "  " << c->b.compatibility << endl ;
        c = c->next;
    }
}


int main() {
    //setlocale(LC_ALL, "ukr");
   BOOK book = { " PLANT  ","  FAMILY  "  };
    //add_obj(tail, book);


    int choice;
    char x;
    cout << "**plant account**" << endl;
    cout << "1(add an element to the beginning)" << endl;
    cout << "2(add an element to the end)" << endl;
    cout << "3(delete)" << endl;
    cout << "4(show)" << endl;
    cout << "6(exit)" << endl << endl;
    while (222)
    {                             
        cout << " Choose action : ";
        cin >> choice;
        switch (choice)
        {
        case 1:
            cout << "Plant name: ";
            cin >> book.plant;
            cout << "Plant family: ";
            cin >> book.family;
            cout << "Plant species: ";
            cin >> book.species;
            cout << "Plant sort: ";
            cin >> book.sort;
            cout << "Purpose of the plant: ";
            cin >> book.purpose;
            cout << "Growth area: ";
            cin >> book.territory;
            cout << "Compatibility with other species: ";
            cin >> book.compatibility;
            add_obj(head, book);
            cout << endl;
            break;
        case 2:
            cout << "Plant name: ";
            cin >> book.plant;
            cout << "Plant family: ";
            cin >> book.family;
            cout << "Plant species: ";
            cin >> book.species;
            cout << "Plant sort: ";
            cin >> book.sort;
            cout << "Purpose of the plant: ";
            cin >> book.purpose;
            cout << "Growth area: ";
            cin >> book.territory;
            cout << "Compatibility with other species: ";
            cin >> book.compatibility;
            add_obj(tail, book);
            cout << endl;
            break;
        case 3:
            del_obj(head);
            cout << endl;
            break;
        case 4:
            show();
            cout << endl;
            break;
        case 5:
            cout << " " << endl;
            exit(222);
        }
    }


    return 0;
}


...