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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.05.2014, 17:43   #1
Merkava
 
Регистрация: 21.05.2014
Сообщений: 9
По умолчанию Структуры данных.Язык Си.

Интересен такой вопрос, можно ли удалять элементы с другого конца односвязного списка(образуя очередь) используя только указатель next?
То есть сейчас я могу добавлять и удалять только с одного конца списка, а мне нужно чтобы удаление осуществлялось с одной стороны, но добавление с другой стороны.
Merkava вне форума Ответить с цитированием
Старый 27.05.2014, 18:15   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,292
По умолчанию

А Вы привешиваете элементы в конец списка или в начало?
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 27.05.2014, 18:22   #3
Merkava
 
Регистрация: 21.05.2014
Сообщений: 9
По умолчанию

Я решил использовать еще указатель на голову, программа компилируется и работает, но удаление происходит неправильно.
Код:
struct list
{
	struct element data;
	 struct list *next;
	 struct list *head;
};
Код:
void MakeNull (QUEUE *pqueue, QUEUE *head)
{
	*pqueue = NULL;
	//*head = (&pstack);
}
Код:
struct element Pop (QUEUE *pqueue)
{
	ELEMENT *del;
	struct element x;
	del = *pqueue;
	*pqueue = (*pqueue)->head;
	(*pqueue)->next;
	x=del->data;
	free (del);
	return x;
}
Вот так добавление
Код:
int Push (struct element x, QUEUE *pqueue)
{
	ELEMENT *ins;
	ins = (ELEMENT *) malloc (sizeof (ELEMENT));
	if (ins==NULL) return 0;
	ins->data = x;
	ins->next = *pqueue;
	*pqueue = ins;
	return 1;
}
Цитата:
Сообщение от BDA Посмотреть сообщение
А Вы привешиваете элементы в конец списка или в начало?
Я не понял вопроса.

Последний раз редактировалось Stilet; 27.05.2014 в 21:30.
Merkava вне форума Ответить с цитированием
Старый 27.05.2014, 19:55   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,292
По умолчанию

Если реализуется очередь (первый зашел, первый вышел), то обычно заводят 2 указателя: first и last.
Код:
//Объявление:
elem *first = NULL, *last = NULL;

//Добавление:
elem *a = malloc(sizeof(elem));
a->value = 1;
a->next = NULL;
if (first == NULL)
    first = last = a;
else {
    last->next = a;
    last = a;
}

//Удаление:
if (first != NULL) {
    elem *tmp = first;
    first = first->next;
    if (first == NULL)
        last = NULL;
    free(tmp);
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 28.05.2014, 21:51   #5
Merkava
 
Регистрация: 21.05.2014
Сообщений: 9
По умолчанию

BDA, можно пояснение что к чему здесь обращается
Код:
(last->next = a;)?
last это же указатель на структуру.
Merkava вне форума Ответить с цитированием
Старый 28.05.2014, 21:55   #6
Merkava
 
Регистрация: 21.05.2014
Сообщений: 9
По умолчанию

Я вот так сделал
Код:
int Push (struct element x, QUEUE *queue)
{
	ELEMENT *a = (ELEMENT *) malloc (sizeof (ELEMENT));
	if (a==NULL) return 0;
	ins->data = x;
	queue->next = NULL;
	if (queue->first == NULL)
	queue->fisrt = queue->last = a
	else{
		queue->next = a;
		queue->last = a;
	}
}
И если смотреть логически - не очень получается
Merkava вне форума Ответить с цитированием
Старый 28.05.2014, 22:06   #7
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,292
По умолчанию

Код:
struct data
{
    int a;
};

struct elem
{
    struct data value;
    struct *next;
};

struct queue
{
    struct elem *first, *last;
};

...

void Push(struct data a, struct queue *k)
{
    struct elem *e = malloc(sizeof(struct elem));
    e->value = a;
    e->next = NULL;
    if (k->first == NULL)
        k->first = k->last = e;
    else {
        k->last->next = e;
        k->last = e;
    }
}

...

struct queue q;
q.first = q.last = NULL;
struct data d;
d.a = 1;
Push(d, &q);
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дописать программу.Структуры данных.Язык Си. Merkava Фриланс 2 25.05.2014 16:08
Структуры данных.Язык Си. Merkava Фриланс 3 22.05.2014 02:06
Структуры данных.Язык Си. East Undia Trading Помощь студентам 45 03.03.2014 22:33
Структуры данных - язык С asv1994 Помощь студентам 7 09.05.2013 18:23
язык С. Динамические структуры данных. Виктория Кусяк Помощь студентам 0 26.12.2011 23:51