Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: кольцевой список  (Прочитано 20037 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
Dana
Опытный

ru
Offline Offline
Пол: Женский

« : 25-03-2010 07:26 » 

Всем привет. Хочу вот такое реализовать:
1. Написать программку на С, которая циклически выводит ФИО со смещением на один символ (бегущая строка) используя динамические структуры данных, т.е. linkedlist.
Помогите пжл, охото разобраться! Скромно так...

У меня вот какие идеи:
Код:
#include <stdio.h>
#include <stdlib.h>

/*
 * Структура Element предназначена для хранения значения
 * элемента связного списка и указателя на следующий элемент.
 */
struct SElement
{
char data; // Значение элемента списка
Node *next; // Указатель на следующий элемент
} typedef Node;

/*
 * Структура LinkedList является реализацией односвязного
 * списка. Содержит указатели на первый и последний элементы
 * списка.
 */
struct
{
Node* first; // Первый элемент списка
Node* last; // Последний элемент списка
} typedef LinkedList;

// Создание списка
LinkedList* createLinkedList();
// Удаление списка (очистка памяти)
void deleteLinkedList(LinkedList* list);
// Добавление элемента конец списка
void add(LinkedList* list, char data);
// Задание элемента списка с индексом index
void set(LinkedList* list, int index, char data);
// Получение элемента списка по индексу index
int get(LinkedList* list, int index);

LinkedList* createLinkedList()
{
LinkedList* list = malloc(sizeof(LinkedList));
return list;
}

void deleteLinkedList(LinkedList* list)
{
Element* element = list->first;
while (element != NULL)
{
Element* next = element->next;
free(element);
element = next;
}
}

void add(LinkedList* list, int value)
{
Element* newElement = malloc(sizeof(Element));
newElement->value = value;
if (newElement)
{
if (list->first == NULL)
{
list->first = newElement;
list->last = newElement;
}
else
{
list->last->next = newElement;
list->last = newElement;
}
}
}

void set(LinkedList* list, int index, int value)
{
Element* element = list->first;
int i;
for (i=0; i<index; i++)
{
element = element->next;
}
element->value = value;
}

int get(LinkedList* list, int index)
{
Element* element = list->first;
int i;
for (i=0; i<index; i++)
{
element = element->next;
}
return element->value;
}
Записан

Прославься в городе - возбудишь озлобленье, а домоседом стань - возбудишь подозренье. Не лучше ли тебе, хотя б ты Хызром был, ни с кем не знаться, жить всегда в уединенье?
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 25-03-2010 08:12 » 

Код:
LinkedList* createLinkedList()
{
LinkedList* list = malloc(sizeof(LinkedList));
return list;
}
Обычная практика - сразу делать memset(list, 0, sizeof(LinkedList)) - на всякий случай, чтобы в данных был не мусор, а нули. Кроме того, ты дальше при добавлении элементов проверяешь эти значения на ноль - может сломаться.

И - ты делаешь кольцевой список? Тогда элементы нужно "замыкать", чтобы последний указывал на первый. И, соответственно, в этом случае придётся переделать процедуру удаления списка - впрочем, я бы в любом случае её переделал: если известны голова и хвост списка, то мне кажется более резонным удалять не по критерию element != null, а по критерию попадания в самый последний элемент:
Код:
Element* element = list->first;
Element* remove = NULL;
if (element != NULL)
    do
    {
        remove = element;
        element = element->next;
        free(remove);
    } while (remove!= list->last);
- как-то так, но не совсем Ага
« Последнее редактирование: 25-03-2010 08:17 от Вад » Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 25-03-2010 08:51 » 

а где в голове фост?
т.е. где в кольце голова и где хвост?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 25-03-2010 08:56 » 

/*
 * Структура LinkedList является реализацией односвязного
 * списка. Содержит указатели на первый и последний элементы
 * списка.
 */

Односвязный список потому и называется односвязным, что может указывать, только на следующий элемент.

А по поводу typedef, я такой синаксис что-то вообще впервые вижу.
Да вообще какой-то левый код. Что есть Element ? Где это объявлено?
« Последнее редактирование: 25-03-2010 09:05 от resource » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 25-03-2010 09:07 » 

Dana, эта кипа кода - ну разве что для тренировки. А твоя задача решается гораздо проще,

(переделай под C, так как я пишу на C++)

Код:
const char* NameToRun="Имён Батькович Фамилин";

int len=strlen(NameToRun);
char* temp=new char[len];
if(len)
{
//сдвигаем и выводим в бесконечном цикле (а ты переделай, как нужно)
for(;;)
{
//вывод на экран строки
cout<<temp<<endl;

//циклический сдвиг влево на 1 символ
char c=temp[0];
memmove(temp,temp+1,len-1);
temp[len-1]=c;
}
}

if(temp)
{
delete [] temp;
temp=0;
}

(не тестировал)
Записан

Dana
Опытный

ru
Offline Offline
Пол: Женский

« Ответ #5 : 29-03-2010 07:19 » 

Я с С++ вообще не знакома. Трудно будет переделать, но спасибо.
Записан

Прославься в городе - возбудишь озлобленье, а домоседом стань - возбудишь подозренье. Не лучше ли тебе, хотя б ты Хызром был, ни с кем не знаться, жить всегда в уединенье?
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 29-03-2010 07:26 » 

Dana, никогда не поздно начать учить Улыбаюсь
Записан

Dana
Опытный

ru
Offline Offline
Пол: Женский

« Ответ #7 : 29-03-2010 10:29 » 

Если есть ссылки на хорошие книги по с++ буду рада почитать  Да-да
Записан

Прославься в городе - возбудишь озлобленье, а домоседом стань - возбудишь подозренье. Не лучше ли тебе, хотя б ты Хызром был, ни с кем не знаться, жить всегда в уединенье?
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #8 : 29-03-2010 10:45 » 

не слишком длительный поиск по форму даст искомое Улыбаюсь а также загляни https://club.shelek.ru/viewfiles.php?id=16
Записан

Странно всё это....
Dana
Опытный

ru
Offline Offline
Пол: Женский

« Ответ #9 : 31-03-2010 06:46 » 

/*
 * Структура LinkedList является реализацией односвязного
 * списка. Содержит указатели на первый и последний элементы
 * списка.
 */

Односвязный список потому и называется односвязным, что может указывать, только на следующий элемент.

А по поводу typedef, я такой синаксис что-то вообще впервые вижу.
Да вообще какой-то левый код. Что есть Element ? Где это объявлено?
Element взят ну просто так
Записан

Прославься в городе - возбудишь озлобленье, а домоседом стань - возбудишь подозренье. Не лучше ли тебе, хотя б ты Хызром был, ни с кем не знаться, жить всегда в уединенье?
Dana
Опытный

ru
Offline Offline
Пол: Женский

« Ответ #10 : 01-04-2010 05:48 » 

Что я делаю не так, выдает ошибки:
Compiling: C:\Users\Dana\Desktop\LinkedList - копия.c
C:\Users\Dana\Desktop\LinkedList - копия.c:26: error: expected initializer before '*' token
C:\Users\Dana\Desktop\LinkedList - копия.c: In function `LinkedList* createLinkedList()':
C:\Users\Dana\Desktop\LinkedList - копия.c:38: error: invalid conversion from `void*' to `LinkedList*'
C:\Users\Dana\Desktop\LinkedList - копия.c: In function `void add(LinkedList*, int)':
C:\Users\Dana\Desktop\LinkedList - копия.c:64: error: invalid conversion from `void*' to `Element*'
Process terminated with status 1 (0 minutes, 1 seconds)
3 errors, 0 warnings



Код:
#include <stdio.h>
#include <stdlib.h>


struct SElement
{
char value; // Значение элемента списка
struct SElement* next; // Указатель на следующий элемент
} typedef Element;


struct
{
Element* first; // Первый элемент списка
Element* last; // Последний элемент списка
} typedef LinkedList;

// Создание списка
void LinkedList* createLinkedList();
// Удаление списка (очистка памяти)
void deleteLinkedList(LinkedList* list);
// Добавление элемента конец списка
void add(LinkedList* list, char value);
// Задание элемента списка с индексом index
void set(LinkedList* list, char index, char value);
// Получение элемента списка по индексу index
int get(LinkedList* list, char index);

LinkedList* createLinkedList()
{
LinkedList* list = malloc(sizeof(LinkedList));
if(list)
{
list->first = list->last = NULL;
return list;
}
else
{
printf("Error limit memori.\n");
exit(1);
}
}

void deleteLinkedList(LinkedList* list)
{
Element* element = list->first;
while (element != NULL)
{
Element* next = element->next;
free(element);
element = next;
}
}

void add(LinkedList *list, int value)
{
Element *newElement = malloc(sizeof(Element));
newElement->value = value;
if (newElement)
{
if (list->first == NULL)
{
list->first = newElement;
list->last = newElement;
newElement->next = NULL;
}
else
{
list->last->next = newElement;
list->last = newElement;
newElement->next = NULL;
}
}
else
{
printf ("Error limit memory\n");
exit (1);
}
}


void set(LinkedList* list, int index, int value)
{
Element* element = list->first;
int i;
for (i=0; i<index; i++)
{
element = element->next;
}
element->value = value;
}

int get(LinkedList* list, int index)
{
Element* element = list->first;
int i;
for (i=0; i<index; i++)
{
element = element->next;
}
return element->value;
}

Записан

Прославься в городе - возбудишь озлобленье, а домоседом стань - возбудишь подозренье. Не лучше ли тебе, хотя б ты Хызром был, ни с кем не знаться, жить всегда в уединенье?
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #11 : 01-04-2010 06:13 » 

а на какую строку ругается то ?


наверное, вот это
Код:
struct SElement
{
char value; // Значение элемента списка
struct SElement* next; // Указатель на следующий элемент
} typedef Element;

struct
{
Element* first; // Первый элемент списка
Element* last; // Последний элемент списка
} typedef LinkedList;



напиши так:

Код:
struct Element
{
char value; // Значение элемента списка
struct Element* next; // Указатель на следующий элемент
};

struct LinkedList
{
Element* first; // Первый элемент списка
Element* last; // Последний элемент списка
};

Записан

Dana
Опытный

ru
Offline Offline
Пол: Женский

« Ответ #12 : 02-04-2010 03:16 » 

 Не понял
Все равно ругается, вот:

Код:
//26 строка:
void LinkedList* createLinkedList();

error: expected initializer before '*' token
« Последнее редактирование: 02-04-2010 03:31 от Алексей1153++ » Записан

Прославься в городе - возбудишь озлобленье, а домоседом стань - возбудишь подозренье. Не лучше ли тебе, хотя б ты Хызром был, ни с кем не знаться, жить всегда в уединенье?
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #13 : 02-04-2010 03:26 » new

Код:
void LinkedList * createLinkedList();
компилятор хочет знать, всё таки функция возвращает void или LinkedList
замени на
Код:
LinkedList * createLinkedList();

у тебя там не одна такая функция объявлена
Записан

Странно всё это....
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #14 : 02-04-2010 03:33 » 

Dana, не ленись вместо тяжёлого скрина пару строчек переписать Улыбаюсь
Записан

Dana
Опытный

ru
Offline Offline
Пол: Женский

« Ответ #15 : 02-04-2010 04:50 » 

А тут вроде все нормально, а тоже ругается:
Код:
LinkedList* createLinkedList()
{
LinkedList* list = malloc(sizeof(LinkedList));
if(list)
{
list->first = list->last = NULL;
return list;
}
else
{
printf("Error limit memori.\n");
exit(1);
}
}
говорит:
invalid conversion from `void*' to `LinkedList*' А черт его знает...
Записан

Прославься в городе - возбудишь озлобленье, а домоседом стань - возбудишь подозренье. Не лучше ли тебе, хотя б ты Хызром был, ни с кем не знаться, жить всегда в уединенье?
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #16 : 02-04-2010 05:10 » 

LinkedList* list = (LinkedList*)malloc(sizeof(LinkedList));
Записан

Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #17 : 02-04-2010 06:41 » 

Dana, хочу к сказанному Алексеем добавить, что это не просто "так надо", а потому, что malloc - штука универсальная, она просто выделяет память, а потому возвращает void* - этого достаточно, чтобы вернуть адрес в памяти.

Ты же пытаешься присвоить этот void* (указатель на пустой тип) указателю на список, и тут тебя останавливает контроль типов и спрашивает: "а что это вы присваиваете указатель не своего типа?" Поэтому тип нужно привести к нужному, прежде чем присваивать. Что Лёша и продемонстрировал.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines