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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.05.2010, 19:31   #1
Lexeres
Новичок
Джуниор
 
Регистрация: 15.11.2009
Сообщений: 54
По умолчанию Из линейного списка в двусвязный(Си)

Помогите переделать задания из линейного списка в двусвязный список. Тут вроде бы как переделывать немножко совсем, но сам я ну просто никак ... не получается...

Вот задания и код , сделанный по методу линейного списка - его и нужно редактировать чуток... учту ваш труд
1) одно число целого типа (уникальный номер) и один символ
2) Создать функцию для добавления элементов в упорядоченный по убыванию список исключающий добавление повторяющихся элементов
3) Удаление всех элементов в списке по переданным данным
4) Последовательный поиск до конца
5) Функция вывода списка (последовательный проход по списку с выводом значений элементов на экран)
6) Дополнительная функция: Функция которая выводит на печать список в обратном порядке (использовать рекурсию).

Код программы:

Код:
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
#include <string.h>

typedef struct node
{	int data;
char data1;
struct node *next;
} ITEM;

ITEM* add_node(ITEM* head, int new_data, char new_data1)
{
	ITEM *new_item,*prev,*next1;
	new_item=(ITEM *)malloc(sizeof(ITEM));
	if(new_item==NULL)
	{
		puts("Oshibka vydeleniya pamyati");
		return head;
	}
	new_item->data=new_data;
	new_item->data1=new_data1;
	new_item->next=NULL;
	if(head==NULL)
{
		puts("Spisok sozdan");
		return new_item;}
	else
{
		prev=head;
		next1=head->next;
		if (prev->data<new_data)
{
			new_item->next=head;
			printf("Element wstawlen w nachalo");
			return new_item;
}
		while((prev->next->data>new_data)&&(next1!=NULL))
{
			prev=next1;
			next1=next1->next;
}
		if(prev->data==new_data)
{
			printf("Takoj element uze est'");
			return head;}
		else
{
			new_item->next=next1;
			prev->next=new_item;
			printf("Element dobawlen");
			return head;
}
	}

}
ITEM* udal_node(ITEM* head, int udal_data)
{
ITEM *cur=head, *prev=NULL;
while((cur!=NULL) && (cur->data>=udal_data))
	if(cur->data==udal_data)
		if (cur==head)
{
			prev=cur->next;
			free(cur);
			printf("Udalena golowa spiska");
			return prev;
}
		else{
			prev->next=cur->next;
			free(cur);
			printf("Element udalen");
			return head;
}
		else
{
		prev=cur;
		cur=cur->next;
}
printf("Element otsutstwuet w spiske");
return head;
}

ITEM* poisk_node(ITEM* head, int find_data)
{
	ITEM *cur=head;
	while((cur!=NULL) && (cur->data>=find_data))
	{
		if(cur->data==find_data)
			return cur;
		cur=cur->next;
	}
	return NULL;
}
ITEM* vyvod_node(ITEM* head)
{	ITEM *cur=head;
	clrscr();
	if (cur==NULL)
{
		puts("Spisok ne sozdan");
		return cur;
}
	else
	{
	printf("Spisok\n");
	while(cur!=NULL)
		{
		printf("%5d%3c\n",cur->data,cur->data1);
		cur=cur->next;
		}
	}
	return head;
}

void recurs_node(ITEM* head)
{	ITEM *cur=head;
	if (cur->next!=NULL)
		recurs_node(cur->next);
	printf("%5d%3c\n",cur->data,cur->data1);
	return 0;
}

int main()
{
	ITEM *Head=NULL,*search;
	char data1;
	char key;
	int data;
	while(1)
	{
		clrscr();
		puts("1 - Dobavit' element");
		puts("2 - Udalit' element");
		puts("3 - Naiti element");
		puts("4 - Vyvod spiska");
		puts("5 - Spec. funkciya");
		puts("ESC - Quit");
		key=getch();
		switch(key)
		{
		case '1':
			clrscr();
			printf("Vvedite chislo\n");
			fflush(stdin);
			scanf("%d",&data);
			printf("Vvedite simvol\n");
			fflush(stdin);
			scanf("%c",&data1);
			Head=add_node(Head,data,data1);
			break;
		case '2':
			clrscr();
			printf("Vvedite chislo\n");
			fflush(stdin);
			scanf("%d",&data);
			Head=udal_node(Head,data);
			break;
		case '3':
			clrscr();
			if (Head==NULL)
				printf("Spisok ne sozdan");
			else{
				printf("Vvedite chislo\n");
				fflush(stdin);
				scanf("%d",&data);
				clrscr();
				if((search=poisk_node(Head,data))==NULL)
					printf("Element ne naiden\n");
			else{
				printf("Element naiden\n");
				printf("%5d%3c",search->data,search->data1);
				search=NULL;}}
			break;
		case '4':
			Head=vyvod_node(Head);
			break;
		case '5':
			clrscr();
			if (Head==NULL)
				printf("Spisok ne sozdan\n");
			else
{
				printf("Spisok w obratnom porjadke\n");
				recurs_node(Head);
}
			break;

		case 27:
			puts("Quit");
			return 0;
		} getch();
	}   return 0;    }

Последний раз редактировалось Lexeres; 06.05.2010 в 19:35.
Lexeres вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программная реализация однонаправленного линейного списка Денис Ст Помощь студентам 2 14.01.2014 21:50
Сортировка линейного списка alesfer Помощь студентам 1 03.04.2010 21:16
Сортировка линейного списка, реализованного двумя массивами coptor Общие вопросы Delphi 1 28.11.2008 18:45
Сортировка линейного списка. ТИВ Паскаль, Turbo Pascal, PascalABC.NET 3 23.11.2008 22:39