Показать сообщение отдельно
Старый 26.05.2009, 12:29   #18 (permalink)
csbwalker
Member
 
Аватар для csbwalker
 
Регистрация: 03.03.2009
Сообщений: 87
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 187
По умолчанию

Цитата:
Сообщение от бородёнок Посмотреть сообщение
а если немного изменить условия:
Строки текста, считанных с 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;    
}
csbwalker вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070