Найти ошибку и ещё одно задание на С - 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; } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д