Dana
|
|
« : 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; }
|
|
|
Записан
|
Прославься в городе - возбудишь озлобленье, а домоседом стань - возбудишь подозренье. Не лучше ли тебе, хотя б ты Хызром был, ни с кем не знаться, жить всегда в уединенье?
|
|
|
Вад
|
|
« Ответ #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
|
|
« Ответ #2 : 25-03-2010 08:51 » |
|
а где в голове фост? т.е. где в кольце голова и где хвост?
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #3 : 25-03-2010 08:56 » |
|
/* * Структура LinkedList является реализацией односвязного * списка. Содержит указатели на первый и последний элементы * списка. */
Односвязный список потому и называется односвязным, что может указывать, только на следующий элемент. А по поводу typedef, я такой синаксис что-то вообще впервые вижу. Да вообще какой-то левый код. Что есть Element ? Где это объявлено?
|
|
« Последнее редактирование: 25-03-2010 09:05 от resource »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
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
|
|
« Ответ #5 : 29-03-2010 07:19 » |
|
Я с С++ вообще не знакома. Трудно будет переделать, но спасибо.
|
|
|
Записан
|
Прославься в городе - возбудишь озлобленье, а домоседом стань - возбудишь подозренье. Не лучше ли тебе, хотя б ты Хызром был, ни с кем не знаться, жить всегда в уединенье?
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #6 : 29-03-2010 07:26 » |
|
Dana, никогда не поздно начать учить
|
|
|
Записан
|
|
|
|
Dana
|
|
« Ответ #7 : 29-03-2010 10:29 » |
|
Если есть ссылки на хорошие книги по с++ буду рада почитать
|
|
|
Записан
|
Прославься в городе - возбудишь озлобленье, а домоседом стань - возбудишь подозренье. Не лучше ли тебе, хотя б ты Хызром был, ни с кем не знаться, жить всегда в уединенье?
|
|
|
|
Dana
|
|
« Ответ #9 : 31-03-2010 06:46 » |
|
/* * Структура LinkedList является реализацией односвязного * списка. Содержит указатели на первый и последний элементы * списка. */
Односвязный список потому и называется односвязным, что может указывать, только на следующий элемент. А по поводу typedef, я такой синаксис что-то вообще впервые вижу. Да вообще какой-то левый код. Что есть Element ? Где это объявлено? Element взят ну просто так
|
|
|
Записан
|
Прославься в городе - возбудишь озлобленье, а домоседом стань - возбудишь подозренье. Не лучше ли тебе, хотя б ты Хызром был, ни с кем не знаться, жить всегда в уединенье?
|
|
|
Dana
|
|
« Ответ #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; }
|
|
|
Записан
|
Прославься в городе - возбудишь озлобленье, а домоседом стань - возбудишь подозренье. Не лучше ли тебе, хотя б ты Хызром был, ни с кем не знаться, жить всегда в уединенье?
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
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
|
|
« Ответ #12 : 02-04-2010 03:16 » |
|
Все равно ругается, вот: //26 строка: void LinkedList* createLinkedList();
error: expected initializer before '*' token
|
|
« Последнее редактирование: 02-04-2010 03:31 от Алексей1153++ »
|
Записан
|
Прославься в городе - возбудишь озлобленье, а домоседом стань - возбудишь подозренье. Не лучше ли тебе, хотя б ты Хызром был, ни с кем не знаться, жить всегда в уединенье?
|
|
|
Антон (LogRus)
|
|
« Ответ #13 : 02-04-2010 03:26 » |
|
void LinkedList * createLinkedList();
компилятор хочет знать, всё таки функция возвращает void или LinkedList замени на LinkedList * createLinkedList();
у тебя там не одна такая функция объявлена
|
|
|
Записан
|
Странно всё это....
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #14 : 02-04-2010 03:33 » |
|
Dana, не ленись вместо тяжёлого скрина пару строчек переписать
|
|
|
Записан
|
|
|
|
Dana
|
|
« Ответ #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*'
|
|
|
Записан
|
Прославься в городе - возбудишь озлобленье, а домоседом стань - возбудишь подозренье. Не лучше ли тебе, хотя б ты Хызром был, ни с кем не знаться, жить всегда в уединенье?
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #16 : 02-04-2010 05:10 » |
|
LinkedList* list = (LinkedList*)malloc(sizeof(LinkedList));
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #17 : 02-04-2010 06:41 » |
|
Dana, хочу к сказанному Алексеем добавить, что это не просто "так надо", а потому, что malloc - штука универсальная, она просто выделяет память, а потому возвращает void* - этого достаточно, чтобы вернуть адрес в памяти.
Ты же пытаешься присвоить этот void* (указатель на пустой тип) указателю на список, и тут тебя останавливает контроль типов и спрашивает: "а что это вы присваиваете указатель не своего типа?" Поэтому тип нужно привести к нужному, прежде чем присваивать. Что Лёша и продемонстрировал.
|
|
|
Записан
|
|
|
|
|