Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.03.2013, 23:43   #1
Praud
Форумчанин
 
Аватар для Praud
 
Регистрация: 11.10.2012
Сообщений: 409
По умолчанию Динамические структуры ошибка

Код:
#include "stdafx.h"
#include "stdio.h"
#include "conio.h"
#include "malloc.h"

typedef struct listnode
{
	int data;
	struct listnode *next;
}LIST;

LIST *create_list();
LIST *head;
void display(LIST *st);


int main(LIST *lst, LIST *head, LIST *current, LIST *prev)
{
	create_list();
	printf("Current list:\n");
	display(head);
	while(lst)
	{
	if(lst->data<=0)
	{
	lst=(LIST*)malloc(sizeof(LIST*));
	lst->data=222;
	prev->next=lst;
	prev=lst;
	}
	}
	printf("Modified list:\n");
	display(head);
	_getch();
	return 0;
}

LIST *create_list()
{
	int item;
	LIST *current, *prev;
	char c;

	head=current=prev=(LIST*)malloc(sizeof(LIST*));
	printf("Item :\n");
	scanf_s("%d", &item);
	current->data=item;
	do{
		current=(LIST*)malloc(sizeof(LIST*));
		printf("Item: \n");
		scanf_s("%d", &item);
		current->data=item;
		prev->next=current;
		prev=current;
		printf("end? Y/N?\n");
		c=_getch();
	}
	while(c!='y');
	current->next=NULL;
	return head;
}

void display(LIST *lst)
{
	LIST *cur=lst;
	while(cur)
	{
		printf("%d-->", cur->data);
		cur=cur->next;
}
	printf("NULL\n");

}
Добавить в список L после каждого отрицательного элемента значение Х.

Само задание расположено в функции main. Там и ошибка.
Что я не так написал?

А, да вместо X я использовал 222
Praud вне форума Ответить с цитированием
Старый 14.03.2013, 03:22   #2
kidiam
 
Регистрация: 05.07.2010
Сообщений: 4
По умолчанию

Главная ошибка в цикле, который добавляет твой 222.

Во-первых, там условие "<=" вместо "=", что конечно не критично.
Во-вторых, главная функция как-то странно определена. Вместо привычных параметров argv и argc (которые обычно вообще пропускают) определяется множество параметров. Лучше определить так
Код:
int main()
{
     LIST *current, *lst;
В-третьих, список head определен дважды: локально в main и глобально. Лучше делать все определения локальными.
В-четвертых, созданные элементы (выделенные) функцией malloc не удаляются (не освобождаются) функцией free. Например так
Код:
void delete_list(LIST *p)
{
    LIST *cur;
    for(;p;) {
        cur = p;
        p = p->next;
        free(cur);
    }
}
Последнее, и самое главное, сам цикл лучше сделать так
Код:
    for(current=head; current; current=current->next)
    {
        if(current->data<0)
        {
            lst = (LIST*)malloc(sizeof(LIST*));
            lst->data = 222;
            lst->next = current->next;
            current->next = lst;
            current = lst;
        }
    }
Т.е. сначала выделяем память под новый элемент lst, затем заполняем все его поля.
Для текущего (current) элемента изменяем ссылку на следующий элемент - новое значение и есть, только что созданный, элемент lst.
Последняя строка изменяет значение текущего элемента на следующий, только что вставленный lst. Если это не сделать, то главный цикл (for) перейдет на следующий элемент после текущего, но мы там добавили наш новый элемент, т.е. следующим в цикле будет проверен только что вставленный lst элемент, а если он тоже окажется отрицательным - получим грустную ситуацию.
kidiam вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамические структуры данных, списковые структуры (надо разобраться что делает программа) _4Alex4_ Помощь студентам 1 14.11.2012 07:39
ошибка в программе....динамические структуры.... роксис Помощь студентам 0 30.06.2011 22:05
Динамические структуры в С++ Aleksa_ks Помощь студентам 0 04.05.2010 21:50
динамические структуры Елена Лапуля Помощь студентам 3 04.05.2010 08:57