| 
			| 
					
						| 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* (указатель на пустой тип) указателю на список, и тут тебя останавливает контроль типов и спрашивает: "а что это вы присваиваете указатель не своего типа?" Поэтому тип нужно привести к нужному, прежде чем присваивать. Что Лёша и продемонстрировал.
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	|  |