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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.07.2015, 19:33   #1
Grai
 
Регистрация: 02.07.2015
Сообщений: 8
По умолчанию Удаление элемента в двунаправленном списке из начала

Сам код программы
Код:
#include "stdio.h"
#include "malloc.h"
#include "locale.h"


struct elsp
	{
		int info;
		struct elsp *next;
		struct elsp *prev;
	};

void addnode(struct elsp **tail);
void printall(struct elsp **head);
void del(struct elsp **head,struct elsp **tail);
void max(struct elsp **head);

void main()
{
	setlocale(LC_ALL,"rus");
	int a;
	struct elsp *head,*tail;
	head=(struct elsp*) malloc(sizeof(struct elsp));
	head->next=NULL;
	head->prev=NULL;
	tail=head;
	do
	{
	 printf("1. Добавить запись\n");
	 printf("2. Удалить запись\n");
	 printf("3. Вывод списка\n");
	 printf("4. Максимальный элемент\n");
	 printf("5. Выход\n");
	 scanf("%d",&a);
	 switch(a)
	{
	 case 1:printf("---------------\n");addnode(&tail);;break;
	 case 3:printf("---------------\n");printall(&head);break;
	 case 2:printf("---------------\n");del(&head,&tail);break;
	 case 4:printf("---------------\n");max(&head);break;
	};
	}
	while(a!=5);
	free(head);
}

void addnode(struct elsp **tail)
{   
	struct elsp *temp;
	int a;
	if ((*tail)->info!=-842150451)
	{
       temp=(struct elsp*) malloc(sizeof(struct elsp));
	   (*tail)->next=temp;
	   (*tail)->prev=*tail;
	   temp->prev=*tail;
	   temp->next=NULL;
	   printf("Запись: ");
	   scanf("%d",&a);
	   temp->info=a;
	   *tail=temp;
	}
	else
	{
	   printf("Запись: ");
	   scanf("%d",&a);
	   (*tail)->info=a;
	}
}

void printall(struct elsp **head)
{
	struct elsp *temp;
	temp=*head;
	while (temp)
	{
		printf("%d\n",temp->info);
		temp=temp->next;
	}
}

void max(struct elsp **head)
{
	printf("В разработке\n");
	printf("\n");
}

void del(struct elsp **head,struct elsp **tail)
{
	struct elsp *temp;
	int a;
	temp=*head;
	temp->info=temp->next->info;
	temp->next=temp->next->next;
	temp=temp->next;
	*head=temp->prev;
	(*head)->prev=NULL;
	(*head)->next=temp->next->next;
}
Моя попытка сделать удаление
Код:
void del(struct elsp **head,struct elsp **tail)
{
struct elsp *temp;
int a;
temp=*head;
temp->info=temp->next->info;
temp->next=temp->next->next;
temp=temp->next;
*head=temp->prev;
(*head)->prev=NULL;
(*head)->next=temp->next->next;
}
Подскажите, пожалуйста.
Grai вне форума Ответить с цитированием
Старый 02.07.2015, 20:13   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
void del()
{
struct elsp *temp;
if(head) temp=head->next; else return;
 delete head;
 head=temp;
}
И все. Переносишь голову чуть ниже по списку и ниче другого не нужно.
Или я тебя неверно понял?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.07.2015, 20:19   #3
Grai
 
Регистрация: 02.07.2015
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Код:
void del()
{
struct elsp *temp;
if(head) temp=head->next; else return;
 delete head;
 head=temp;
}
И все. Переносишь голову чуть ниже по списку и ниче другого не нужно.
Или я тебя неверно понял?
Нужно удалить первый элемент в списке, вроде так.

Проверить не могу, ошибки лезут :С
Цитата:
Ошибка 5 error C2440: =: невозможно преобразовать 'elsp *' в 'elsp **'
Ошибка 4 error C2227: выражение слева от "->next" должно указывать на тип класса, структуры или объединения либо на универсальный тип

Последний раз редактировалось Stilet; 02.07.2015 в 21:28.
Grai вне форума Ответить с цитированием
Старый 02.07.2015, 21:36   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Дак, ты двойные указатели убери )
Зачем они тебе вообще? не пойму...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.07.2015, 21:50   #5
Grai
 
Регистрация: 02.07.2015
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Дак, ты двойные указатели убери )
Зачем они тебе вообще? не пойму...
Без них вообще мильен ошибок :D
Grai вне форума Ответить с цитированием
Старый 02.07.2015, 22:36   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну если бы ты был заинтересован ее решить, ты бы решил. А так сразу видно, что тебе не интересно. Бросал бы ты это обучение, пока не поздно.
Код:
#include <stdio.h>
#include <stdlib.h>
#include "malloc.h"
#include "locale.h"


struct elsp
	{
		int info;
		struct elsp *next;
		struct elsp *prev;
	} *head=0,*tail=0;

void addnode();
void printall();
void del();
void max();


int main()
{
setlocale(LC_ALL,"rus");
	int a;
	do
	{
	 printf("1. Добавить запись\n");
	 printf("2. Удалить запись\n");
	 printf("3. Вывод списка\n");
	 printf("4. Максимальный элемент\n");
	 printf("5. Выход\n");
	 scanf("%d",&a);
	 switch(a)
	{
	 case 1:printf("---------------\n");addnode();;break;
	 case 3:printf("---------------\n");printall();break;
	 case 2:printf("---------------\n");del();break;
	 case 4:printf("---------------\n");max();break;
	};
	}
	while(a!=5);
	free(head);
    return 0;
}


void addnode()
{
	struct elsp *temp;
	int a;

       temp=(struct elsp*) malloc(sizeof(struct elsp));
       if(tail){
           tail->next=temp;
           temp->prev=tail;
       }
	   temp->next=NULL;
	   printf("Запись: ");
	   scanf("%d",&a);
	   temp->info=a;
	   tail=temp;

	if(!head) head=tail;
}

void printall()
{
	struct elsp *temp;
	temp=head;
	while (temp)
	{
		printf("%d\n",temp->info);
		temp=temp->next;
	}
}

void max()
{
	printf("В разработке\n");
	printf("\n");
}


void del(){
struct elsp *temp;
if(head) temp=head->next; else return;
 free(head);
 head=temp;
}
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.07.2015, 04:29   #7
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Я извиняюсь, может вопрос немного не по теме, но для чего писать объявление структуры так:
Код:
struct elsp *temp;
У меня все отлично работает, если написать без слова struct, т.е. так:
Код:
elsp *temp;
Но многие пишут со словом struct. Никак не могу этого понять.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Старый 03.07.2015, 12:54   #8
Helloween
Форумчанин
 
Регистрация: 24.04.2012
Сообщений: 300
По умолчанию

В чистом С нельзя было объявлять переменную структуры без приставки struct
Помог? Оставляем отзыв =)
Helloween вне форума Ответить с цитированием
Старый 03.07.2015, 14:58   #9
Grai
 
Регистрация: 02.07.2015
Сообщений: 8
По умолчанию

Спасибо, еще нужно написать нахождение максимального элемента.
Вот моя попытка
Код:
void max()
{
	max=p->info;
	while(p->next!=NULL)
	{
		if(max<p->info) max=p->info;
		p=p->next;
	}
	while(p->info!=max)
	{
		p=p->next;
	}
	printf("%d",max);
}
В саму программу он явно не вписался :С
Grai вне форума Ответить с цитированием
Старый 03.07.2015, 15:25   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
void max()
{
	int max;
 if(!head){printf("Немае данных.Сайонара."); return;}
 for(struct elsp *i;i;i=i->next) max+=i->info;
 printf("%d",max);
 return;
}
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Процедура удаления в двунаправленном списке mishammm Помощь студентам 1 04.05.2014 07:05
Удаление элемента в двусвязном списке (Delphi). tgig Помощь студентам 4 10.10.2013 10:36
Проблемы с удалением элемента в списке JonnyFletcher Общие вопросы Delphi 1 26.05.2013 21:32
Нахождение максимального отрицательного элемента в одномерном списке elf01 C++ Builder 1 27.03.2012 09:36
winapi выбор элемента в списке mapt34 Win Api 1 13.06.2010 19:41