Найти ошибку и ещё одно задание на С - C (СИ)
Формулировка задачи:
написал прогу по двусвязным спискам ,и было задание - вывести все элементы в обратном порядке, использовав рекурсию... в обычных списках сделал, а тут переделал, но 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;
}
}
}
А ещё в другой программе нужно написать среднегеометрическое для вещественных чисел в дереве...
Код:
#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();
}
}Решение задачи: «Найти ошибку и ещё одно задание на С»
textual
Листинг программы
#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(ITEM* cur)
{
if (cur != 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");
ITEM *cur = Head->first;
recurs_node(cur);
}
break;
case 27:
puts("Exit");
return 0;
}
}
}