Цитата:
Сообщение от бородёнок
а если немного изменить условия:
Строки текста, считанных с stdin, сохранить в двусвязный список, массив. Результат на stdout, реверсировать на выводе.
заранее благодарен.
|
Постарайся, пожалуйста, больше так не делать (одинаковые посты в разных темах), т.к. очень сложно определить при таком подходе - решена проблема или нет, ок??
Вот код:
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct listNode
{
char *str;
struct listNode *before;
struct listNode *after;
};
void listInit(struct listNode *node)
{
node->str = NULL;
node->before = NULL;
node->after = NULL;
}
int listPush(struct listNode *node, char *str)
{
/* Переходим к последнему элементу */
while(node->after != NULL)
node = node->after;
/* Если в элементе не записана строка - то записываем в него, иначе -
создаём новый элемент */
if(node->str != NULL)
{
/* Выделяем память под новый элемент, записываем указатель на него */
node->after = malloc(sizeof(struct listNode));
if(node->after == NULL)
return 0;
/* Инициализируем новый элемент */
listInit(node->after);
/* Записываем в новый элемент указатель на тот, который ранее был последним */
node->after->before = node;
/* Переключаем node на новый элемент */
node = node->after;
}
/* Выделяем в элементе память под строку */
node->str = malloc(sizeof(char)*(strlen(str) + 1));
if(node->str == NULL)
return 0;
/* Записываем строку в элемент */
strcpy(node->str, str);
return 1;
}
void listReversePrint(struct listNode *node)
{
/* Переходим к последнему элементу */
while(node->after != NULL)
node = node->after;
/* Выводим все элементы в обратном порядке */
while(node != NULL)
{
if(node->str != NULL)
printf("STRING: <%s>\n", node->str);
node = node->before;
}
}
int main()
{
struct listNode *first;
char str[81];
/* Создаём корневой элемент списка */
first = malloc(sizeof(struct listNode));
if(first == NULL)
{
printf("Error!\n");
return 1;
}
listInit(first);
/* Цикл запроса строк */
do
{
printf("Enter string, or '*' to exit: ");
scanf("%s", str);
if((strlen(str) == 1) && (str[0] == '*'))
break;
} while(listPush(first, str));
/* Выводим результат - список в обратном порядке */
printf("Nodes (reverse):\n");
listReversePrint(first);
return 0;
}