Мне нужно создать двусвязный список, в котором хранятся разные типы данных.
Я не могу ввести несколько слов через консоль через пробел в одной строке, чтобы они были записаны в одну переменную. Я пробовал использовать 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;
}