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

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

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

Восстановить пароль

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

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

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

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

LIST *create_list();
LIST *head;
void display(LIST *lst);
int take_off(LIST *lst, int *err);
void job(LIST *lst);

int main()
{
	create_list();
	display(head);
	_getch();
	job(head);
	_getch();
	display(head);
	_getch();
	return 0;
}

LIST *create_list()
{
	int item;
	char c;
	LIST *current, *prev;
	head=prev=current=(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 of list?\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");
}

int take_off(LIST *lst, int *err)
{
	int value=0;
	LIST *old_header=lst;

	if(lst)
	{
		value=old_header->data;
		lst=lst->next;
		free(old_header);
		*err=0;
	}
	else
		*err=1;

	return value; 
}

void job(LIST *lst)
{
	int err;
	printf("%d \n", take_off(lst , &err));
}
написал динамическую структуру в виде очереди.
Нужно удалить из очереди элемент, а я не пойму как.
Написал функцию take_off, пытаюсь в jobe её задействовать. Но после того как идет переход в функцию job консолька закрывается и выдается еррор.

Помогите найти ошибку.
Praud вне форума Ответить с цитированием
Старый 15.03.2013, 19:48   #2
Ezhik Kihze
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 639
По умолчанию

начните с создания списка...

Вопросы для размышления:
Сколько памяти выделит
Код:
malloc(sizeof(LIST*))
?
А сколько хотелось бы?..

П.С. По поводу вашей тейк_оф: вам надо изменять в функции параметр, тип которого есть указатель на структуру. Чтобы изменения остались после работы функции вам нужен указатель. Итак, складываем все вместе, вам нужен указатель на "указатель на структуру", т.е. двойной указатель.
ICQ: 677936656 Gmail: ekEmbed@gmail.com

Последний раз редактировалось Ezhik Kihze; 15.03.2013 в 19:55.
Ezhik Kihze вне форума Ответить с цитированием
Старый 15.03.2013, 20:26   #3
Praud
Форумчанин
 
Аватар для Praud
 
Регистрация: 11.10.2012
Сообщений: 409
По умолчанию

Вот v2

Код:
#include "stdafx.h"
#include "conio.h"
#include "stdio.h"
#include "malloc.h"
#define QUE struct que

QUE
{
	int info;
	QUE *next;
};

void insert(QUE **q, int item);
void take_off(QUE **q, int *err);
QUE *q=NULL;
void display(QUE **q);

int main()
{
	
	insert(&q, 5);
	insert(&q, 8);
	display(&q);
	_getch();
	return 0;
}

void insert(QUE **q, int item)
{
	QUE *current = *q; //текущий элемент списка
	QUE *prev = 0; //предыдущий элемент списка
	QUE *new_node; //просмотри списка до конца

	while(current)  //Идем до конца списка
	{
		prev=current;
		current=current->next;
	}

	new_node=(QUE*)malloc(sizeof(QUE));
	new_node->info=item;

	if(prev)
	{
		new_node->next=prev->next; //заполнить ссылочную часть нового элемента
		prev->next=new_node; //соеденить существующий список с новым элементом
	}
	else
	
		*q=new_node;
		(*q)->next=0;
}

void display(QUE **q)
{
	QUE *cur=*q;
	while(cur)
	{
		printf("%d-->", cur->info);
		cur=cur->next;
	}
	printf("NULL");

}
Теперь вопрос в другом. Добавил 2 элемента в список (insert)
Но дисплей выводит только первый. Как будто второго и нету. В чем проблема?
Praud вне форума Ответить с цитированием
Старый 15.03.2013, 21:07   #4
Ezhik Kihze
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 639
По умолчанию

Зачем столько указателей внутри функции? Вам нужен только один дополнительный для бега по списку.

Код:
new_node->next=prev->next; //заполнить ссылочную часть нового элемента
		prev->next=new_node; //соеденить существующий список с новым элементом
После вашего цикла прев-некст = нулую Зачем лишний раза дергать указатели ради 100% нула?

Фактически все сводится к следущему:
если голова НУЛЛ то создаем голову
иначе врем_указатель = голова, пока врем_указатель-некст != нулу сдвигаем. врем_указатель-некст = маллок ...

П.С. Дисплей не меняет список, двойной указатель ему не к чему и работая с параметром, как с временным указателем, вы уберете лишнюю переменную и лишнее копирование.
ICQ: 677936656 Gmail: ekEmbed@gmail.com

Последний раз редактировалось Ezhik Kihze; 15.03.2013 в 21:09.
Ezhik Kihze вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамические структуры Вероника92 Помощь студентам 0 15.12.2012 15:08
Динамические структуры данных, списковые структуры (надо разобраться что делает программа) _4Alex4_ Помощь студентам 1 14.11.2012 07:39
Динамические структуры danilqa Паскаль, Turbo Pascal, PascalABC.NET 2 11.04.2011 12:16