Текстовые данные в односвязном списке без STL
Написал код, который создает односвязный список и выполняет стандартные операции с ним. Но мой список может работать только с числами (int), теперь нужно что бы он мог работать с текстовыми данными. При том что по постановке задачи указано что "Стандартные классы и STL не использовать", то есть класс "string", если я правильно понимаю, использовать я не могу. Пробовал использовать "char" вместо "int" и записывать через scanf("%s", &numb), но при выполнении функции push(добавление в конец), записывается в список совсем не то, что нужно. Так же, вместо "int" использовал массив сhar`ов (char data[255]), и для записи gets(), но тогда возникает больше количество ошибок, к примеру "|17|error: incompatible types in assignment of 'char' to 'char [255]'" и т.д.
Как мне следует изменить код что бы список поддерживал работу с текстовыми данными (желательно с строками и пробелами, к примеру с текстом "Привет мир!")?
Вот сам код (*Упростил до 2-х функций):
/**Работа с текстовыми данными*/
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <fstream>
using namespace std;
struct Node
{
char data[255];
struct Node *next;
};
void append(struct Node** head_ref, char* new_data) ///добавление в
конец
{
struct Node* new_node = (struct Node*) malloc(sizeof(struct Node));
struct Node *last = *head_ref;
new_node->data = new_data;
new_node->next = NULL;
if (*head_ref == NULL)
{
*head_ref = new_node;
return;
}
while (last->next != NULL)
last = last->next;
last->next = new_node;
return;
}
void printList(struct Node *node) ///печать списка
{
printf("--------СПИСОК--------\n\n");
while (node != NULL)
{
printf(" %s ", node->data);
node = node->next;
}
}
int main()
{
setlocale(LC_ALL,"RUSSIAN");
SetConsoleCP(1251);// установка кодовой страницы win-cp 1251 в
поток ввода
SetConsoleOutputCP(1251); // установка кодовой страницы в поток
вывода
struct Node* head = NULL;
int keys;//переменная для switch
while (1)
{
printf("1. Добавить в конец списка\n");
printf("2. Печать списка\n");
printf("0. Выход\n\n");
printf("Ваш Выбор: ");
scanf("%d", &keys);
switch(keys){
case 0:
{
system("CLS");
break;
}
case 1:///Добавить звено в конец списка
{
system("CLS");
printf("Введите Число: ");
char new_numb[255];
scanf("%s", &new_numb);//переменная в которую записывается
число для добавления в список
char numb[256];
strcpy(numb, new_numb);
append(&head, numb);
system("CLS");
continue;
}
case 2:///Печать
{
system("CLS");
printList(head);//печать
printf("\n\n");
system("PAUSE");
system("CLS");
continue;
}
}
return 0;
}
}
Ответы (1 шт):
Harry, спасибо за ответ, функция копирования strcpy и запись очередного звена через gets помогли решить задачу. Поместил внутри append strcpy(new_node->data, new_data); и использовал вместо сравнения if (temp != NULL && temp->data == key) и if(key_==ptr->data) функцию сравнения строк strcmp().
В результате код принял такой вид:
/**Работа с текстовыми данными.*/
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <fstream>
using namespace std;
struct Node
{
char data[255];
struct Node *next;
};
void insertAfter(struct Node* prev_node, char* new_data) ///
добавление после
{
if (prev_node == NULL)
{
printf("Предыдущий узел не может быть пустым.");
return;
}
struct Node* new_node =(struct Node*) malloc(sizeof(structNode));
strcpy(new_node->data, new_data);
new_node->next = prev_node->next;
prev_node->next = new_node;
}
void append(struct Node** head_ref, char* new_data) ///добавление
{
struct Node* new_node = (struct Node*)
malloc(sizeof(structNode));
struct Node *last = *head_ref; /* used in step 5*/
strcpy(new_node->data, new_data);
new_node->next = NULL;
if (*head_ref == NULL)
{
*head_ref = new_node;
return;
}
while (last->next != NULL)
last = last->next;
last->next = new_node;
return;
}
void deleteNode(struct Node** head_ref, char* key) ///удаление
{
struct Node *temp = *head_ref, *prev;
if (temp != NULL && ((strcmp(temp->data, key))==0)) {
*head_ref = temp->next; // Сменил голову
free(temp); // освободить старую голову
return;
}
while (temp != NULL && ((strcmp(temp->data, key))!=0)) {
prev = temp;
temp = temp->next;
}
if (temp == NULL)
return;
prev->next = temp->next;
free(temp); // Свободная память
}
void Find(struct Node** head_ref, char* key_, char* numb_)
{
struct Node *ptr = *head_ref;
while(1)
{
if((strcmp(key_, ptr->data))==0)
{
insertAfter(ptr, numb_);//вставить после
printf("\n Элемент найден. Новое звено добавлено после %s.\n", ptr->data);
break;
}
if(ptr->next == NULL)
{
printf("\n Элемент не найден\n");
break;
}
ptr = ptr->next;}
}
void printList(struct Node *node) ///печать списка
{
printf("--------СПИСОК--------\n\n");
while (node != NULL)
{
printf(" %s ", node->data);
node = node->next;
}
}
int main()
{
setlocale(LC_ALL,"RUSSIAN");
SetConsoleCP(1251);// установка кодовой страницы win-cp 1251
в поток ввода
SetConsoleOutputCP(1251); // установка кодовой страницы в п
оток вывода
/* Создаем новый пустой список */
struct Node* head = NULL;
int keys;//переменная для switch
while (1)// или же while(true)
{
printf("1. Добавить в конец списка\n");
printf("2. Печать списка\n");
printf("3. Удалить по значению\n");
printf("4. Вставить после указанного\n");
printf("0. Выход\n\n");
printf("Ваш Выбор: ");
scanf("%d", &keys);
switch(keys){
case 0:
{
system("CLS");
break;
}
case 1:///Добавить звено в конец списка
{
system("CLS");
printf("Введите Число: ");
char numb[255];
scanf("%s", &numb);//переменная в которую записывается число для добавления в список
append(&head, numb); //добавление_в_конец
system("CLS");
continue;
}
case 2:///Печать
{
system("CLS");
printList(head);//печать
printf("\n\n");
system("PAUSE");
system("CLS");
continue;
}
case 3:///Удалить по значению
{
system("CLS");
printf("Введите Число: ");
char numb[255];
scanf("%s", &numb);
deleteNode(&head, numb); //удалить
system("PAUSE");
system("CLS");
continue;
}
case 4: /// Вставить после указаного
{
system("CLS");
printf("Введите Число для поиска: ");
char key[255];
scanf("%s", &key);
printf("Введите Число для вставки: ");
char numb[255];
scanf("%s", &numb);
Find(&head, key, numb);//поиск+добавление
system("PAUSE");
system("CLS");
continue;
}
default:
{
system("CLS");
printf(" Некорректные данные,повторите попытку\n");
system("PAUSE");
system("CLS");
break;
}
}
return 0;
}
};