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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.06.2010, 20:07   #1
Lexeres
Новичок
Джуниор
 
Регистрация: 15.11.2009
Сообщений: 54
По умолчанию Найти ошибку и ещё одно задание на С

написал прогу по двусвязным спискам ,и было задание - вывести все элементы в обратном порядке, использовав рекурсию... в обычных списках сделал, а тут переделал, но Warning(Warning: suspicious pointer conversion in function recurs_node) один показывает и не работает функция... !!!-знаками пометил, где ругается компилятор

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

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

typedef struct head
{
	struct node *first;
	struct node *last;
}HEAD;

HEAD* add_node(HEAD* head, int new_data, char new_a)
{
	ITEM *new_item, *prev;
	new_item=(ITEM *)malloc(sizeof(ITEM));
	if(new_item==NULL)
	{
		printf("Oshibka videlenija pamjati\n");
		return head;
	}
	new_item->data=new_data;
	new_item->a=new_a;
	if(head==NULL)
	{
		head=(HEAD *)malloc(sizeof(HEAD));
		puts("Spisok sozdan!");
		new_item->next=NULL;
		new_item->previos=NULL;
		head->first=head->last=new_item;
		return head;
	}
	if(head->first->data<new_data)
	{
		printf("Element %d vstavlen v nachalo spiska\n",new_data);
		new_item->next=head->first;
		head->first->previos=new_item;
		head->first=new_item;
		new_item->previos=NULL;
		return head;
	}
	prev=head->first;
	while(prev->next->data<new_data)
	{
		if(prev->next->data<new_data)
		{
			printf("Element %d vstavlen v seredinu spiska\n",new_data);
			new_item->next=prev->next;
			prev->next=new_item;
			new_item->previos=prev;
			new_item->next->previos=new_item;
			return head;
		}
		else
		{
			prev=prev->next;
		}
	}
	printf("Element %d vstavlen v konec spiska\n",new_data);
	head->last->next=new_item;
	new_item->previos=head->last;
	head->last=new_item;
	new_item->next=NULL;
	return head;
}
HEAD* delete_node(HEAD* head, int kluch)
{
	ITEM *cur, *prev;
	prev=NULL;
	cur=head->first;
	while(cur!=NULL && cur->data>=kluch)
	{
		if(cur->data==kluch)
		{
			while(cur->data==kluch)
			{
			printf("Udalenie elementa %d\n",cur->data);
				if(prev==NULL)
				{
					head->first=cur->next;
					if(head->first!=NULL)
						head->first->previos=NULL;
					if(head->first==NULL)
						head->last=NULL;
				}
				else if(cur==head->last)
				{
					head->last=prev;
					prev->next=NULL;
				}
				else
				{
					prev->next=cur->next;
					cur->next->previos=prev;
				}
				free(cur);
				cur=cur->next;
			}
		}
		prev=cur;
		cur=cur->next;
	}
	printf("Element %d otsutstvuet v spiske\n",kluch);
	return head;
}
void vivod_nachalo(HEAD* head)
{
	ITEM *cur;
	if(head==NULL || head->last==NULL)
	{
		puts("Spisok pust!");
		return;
	}
	cur=head->first;
	while(cur!=NULL)
	{
		printf("%d ", cur->data);
		printf("%c ", cur->a);
		cur=cur->next;
	}
	puts("");
}
void vivod_konec(HEAD* head)
{
	ITEM* cur;
	if(head==NULL || head->last==NULL)
	{
		puts("Spisok pust!");
		return;
	}
	cur=head->last;
	while(cur!=NULL)
	{
		printf("%d ",cur->data);
		printf("%c ",cur->a);
		cur=cur->previos;
	}
	puts("");
}
int find_node(HEAD* head, int find_data)
{
	ITEM *cur;
	cur=head->first;
	while(cur!=NULL && cur->data>=find_data)
	{
		if(cur->data==find_data)
		{
			printf("Element %d naiden\n",find_data);
			return 1;
		}
		cur=cur->next;
	}
	printf("Element %d NE naiden\n",find_data);
	return 0;
}

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

}

int main()
{
	HEAD *Head=NULL;
	char key;
	int chislo, kluch;
	char chislo1;
	while(1)
	{
		clrscr();
		puts("1 - Dobavit' element");
		puts("2 - Udalit' element");
		puts("3 - Vivod spiska");
		puts("4 - Naiti element");
		puts("5 - Spec. funkciya");
		puts("ESC - Exit");
		key=getch();
		switch(key)
		{
		case '1':
			puts("Enter number <int>");
			fflush(stdin);
			scanf("%d",&chislo);
			puts("Enter number <simvol>");
			fflush(stdin);
			scanf("%c",&chislo1);
			Head=add_node(Head,chislo,chislo1);
			getch();
			break;
		case '2':
			puts("Enter number");
			scanf("%d",&chislo);
			Head=delete_node(Head,chislo);
			getch();
			break;
		case '3':
			vivod_nachalo(Head);
			vivod_konec(Head);
			getch();
			break;
		case '4':
			puts("Vvedite chislo");
			scanf("%d",&chislo);
			find_node(Head,chislo);
			getch();
			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("Exit");
			return 0;
		}

	}
}

Последний раз редактировалось Lexeres; 02.06.2010 в 20:12.
Lexeres вне форума Ответить с цитированием
Старый 02.06.2010, 20:07   #2
Lexeres
Новичок
Джуниор
 
Регистрация: 15.11.2009
Сообщений: 54
По умолчанию

А ещё в другой программе нужно написать среднегеометрическое для вещественных чисел в дереве...

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

typedef struct treeNode
{
	struct treeNode *left; 
	float data; 
	struct treeNode *right; 
} TREENODE;

TREENODE* insertNode(TREENODE* tree, float value)
{
	TREENODE* newNode=(TREENODE*)malloc(sizeof(TREENODE));
	TREENODE* root=tree;
	if(newNode!=NULL)
	{
		
		newNode->data=value;
		newNode->left=NULL;
		newNode->right=NULL;
	}
	else
	{
		puts("Error!");
	}
	if(root==NULL) 
		return newNode;
	while(root!=NULL)
	{
		
		if(value<root->data) 
		{	
			if(root->left!=NULL)
				root=root->left;
			else
			{
				root->left=newNode;
				break;
			}
		}
		else if(value>root->data)
		{
			
			if(root->right!=NULL)
				root=root->right;
			else
			{
				root->right=newNode;
				break;
			}
		}
		else
		{
			puts("Clone");
			break;
		}
	}
	return tree;
}

TREENODE* searchNode(TREENODE* tree, float value)
{
	TREENODE* q=tree;
	
	while(q!=NULL)
	{
		if(q->data==value)
			break;
		else
		{
			if(value<q->data)
				q=q->left;
			else 
				q=q->right;
		}
	}
	
	if(q==NULL)
	{
		puts("Not founded!");
		return NULL; 
	}
	puts("Founded!");
	return q;
}



TREENODE* deleteNode(TREENODE* tree, float value)
{
	TREENODE* q=tree;
	TREENODE* parent=NULL;
	TREENODE *s1,*s2,*s;
	TREENODE *max_node;
	int tmp;
	
	while(q!=NULL)
	{
		if(q->data==value)
			break;
		else
		{
			parent=q;
			if(value<q->data)
				q=q->left;
			else 
				q=q->right;
		}
	}
	
	if(q==NULL)
	{
		puts("Not founded!");
		return tree; 
	}
	s1=q->left;
	s2=q->right;
	if(s1==NULL && s2==NULL)
	{
		if(parent!=NULL)
		{
			
			if(parent->left==q)
				parent->left=NULL;
			else parent->right=NULL;
		}
		else
		{
			free(q);
			return NULL;
		}
	}
	else if(s1==NULL || s2==NULL)
	{
		s=(s1==NULL)?s2:s1;
		if(parent!=NULL)
		{
			
			if(parent->left==q)
				parent->left=s;
			else parent->right=s;
		}
		else
		{
			free(q);
			return s;
		}
	}
	else
	{
		max_node=q->left;
		while(max_node->right!=NULL)
		{
			max_node=max_node->right;
		}
		tmp=max_node->data;
		tree=deleteNode(tree,tmp);
		q->data=tmp;
		return tree;
	}
	free(q);
	return tree;
}

void inOrder(TREENODE* tree)
{
	if(tree!=NULL)
	{
		inOrder(tree->left);
		printf("%3f ",tree->data);
		inOrder(tree->right);
	}
}
int main()
{
	TREENODE *tree=NULL, *cur;
	char key;
	float chislo;
	while(1)
	{	clrscr();
		puts("1 - Dobavit' element");
		puts("2 - Udalit' element");
		puts("3 - Print tree");
		puts("4 - Find element");
		puts("5 - Srednee geometricheskoe");
		puts("ESC - Exit");
		key=getch();
		switch(key)
		{	
		case '1':
			puts("Enter number <int>");
			scanf("%f",&chislo);
			if(searchNode(tree,chislo)!=NULL)
			{
				puts("Element is in tree");
				break;
			}
			tree=insertNode(tree,chislo);
			puts("Element is insert");
			getch();
			break;
		case '2':
			puts("Enter number");
			scanf("%f",&chislo);
			tree=deleteNode(tree,chislo);
			getch();
			break;
		case '3':
			if(tree==NULL)
			{
				puts("Tree is empty");
				break;
			}
			inOrder(tree);
			getch();
			break;
		case '4':
			puts("Enter number");
			scanf("%f",&chislo);
			if((cur=searchNode(tree,chislo))!=NULL)
			{
				printf("Element %f\n",cur->data);
				break;
			}
			else
			{
				puts("Element not found!");
				break;
			}

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

	}

}
Помогите кто чем может...

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


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задание: найти и исправить ошибку RubIlNick Помощь студентам 0 07.11.2009 15:45
Выдаёт ошибку: acos DOMAIN error,полсе нажатия окей,ещё одну ошибку pow OWERFLAW ERROR prikolist Общие вопросы C/C++ 4 10.04.2009 20:27
формирование матрицы (задание выполненно не могу найти сваю ошибку) КиношкА Помощь студентам 7 11.01.2008 03:50