shahinshyd
جمعه 09 اردیبهشت 1390, 13:18 عصر
با سلام
ما اینجا دو تا برنامه داریم که مربوط به مبحث ساختمان داده هست
69296
اگه امکان داره از اساتید میخوام یک توضیحی در مورد سورس های این دو برنامه بدهند
1-برنامه ای که فرم پرانتزی یک درخت دودویی را به صورت رشته از ورودی خوانده وان را به فرم لیست پیوندی در حافظه پیاده سازی کرده و پیمایش های مختلف ان را چاپ میکند.
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
typedef struct Node{
int value;
Node*left;
Node*right;
};
int inorder(Node*node1,Node*node2){
int x=1;
if(node1->left&&node2->left)
x=x&inorder(node1->left,node2->left);
else
if(node1->left != node2->left)
x=0;
else
x=x&(node1->value==node2->value);
if(node1->right&&node2->right)
x=x&inorder(node1->right,node2->right);
else
if(node1->right != node2->right)
x=0;
return x;
}
int postorder(Node*node1,Node*node2){
int x=1;
if(node1->left&&node2->left)
x=x&&inorder(node1->left,node2->left);
else
if(node1->left != node2->left)
x=0;
if(node1->right&&node2->right)
x=x&&inorder(node1->right,node2->right);
else
if(node1->right != node2->right)
x=0;
x=x&&(node1->value==node2->value);
return x;
}
int preorder(Node*node1,Node*node2){
int x=1;
x=x&(node1->value==node2->value);
if(node1->left&&node2->left)
x=x&inorder(node1->left,node2->left);
else
if(node1->left != node2->left)
x=0;
if(node1->right&&node2->right)
x=x&inorder(node1->right,node2->right);
else
if(node1->right != node2->right)
x=0;
return x;
}
void Insert(int n,int x,Node*root){
Node*temp=root;
int right=0;
for(int h=1;h!=n && temp;){
for(int j=n;j/2>h;j/=2);
if(j==h*2){
if(temp->left)
temp=temp->left;
right=0;
}
if(j==h*2+1){
if(temp->right)
temp=temp->right;
right=1;
}
h=j;
}
Node*t=(Node*)malloc(sizeof(Node));
t->value=x;
t->left=NULL;
t->right=NULL;
if(right)
temp->right=t;
else
temp->left=t;
}
int main(){
clrscr();
int n,x;
Node*root1=NULL,*root2=NULL;
printf("First tree elements ... \n");
for(;;){
printf("Please Enter a Number for element Place : ");
scanf("%d",&n);
if(n==0)
break;
printf("Please Enter a Number : ");
scanf("%d",&x);
if(!root1){
Node*temp=(Node*)malloc(sizeof(Node));
temp->value=x;
temp->left=NULL;
temp->right=NULL;
root1=temp;
}else
Insert(n,x,root1);
}
printf("\nSecond tree elements ... \n");
for(;;){
printf("Please Enter a Number for element Place : ");
scanf("%d",&n);
if(n==0)
break;
printf("Please Enter a Number : ");
scanf("%d",&x);
if(!root2){
Node*temp=(Node*)malloc(sizeof(Node));
temp->value=x;
temp->left=NULL;
temp->right=NULL;
root2=temp;
}else
Insert(n,x,root2);
}
int issame=inorder(root1,root2)&&postorder(root1,root2)&&preorder(root1,root2);
if(issame)
printf("Binary trees are same");
else
printf("Binary trees are not same");
return 0;
}
2-این برنامه تابعی است که زیردرخت های چپ و راست یک درخت را جابه جا میکند(تا اخرین سطح بصورت بازگشتی ).این تابع دربرنامه میاد خروجی را برای یک درخت فرضی(با چاپ پیمایش های درخت اولیه ودرخت حاصل)ازمایش میکند.
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
typedef struct Node{
int value;
Node*left;
Node*right;
};
void Insert(int n,int x,Node*root){
Node*temp=root;
int right=0;
for(int h=1;h!=n && temp;){
for(int j=n;j/2>h;j/=2);
if(j==h*2){
if(temp->left)
temp=temp->left;
right=0;
}
if(j==h*2+1){
if(temp->right)
temp=temp->right;
right=1;
}
h=j;
}
Node*t=(Node*)malloc(sizeof(Node));
t->value=x;
t->left=NULL;
t->right=NULL;
if(right)
temp->right=t;
else
temp->left=t;
}
void inorder(Node*node){
if(node->left)
inorder(node->left);
printf("%d,",node->value);
if(node->right)
inorder(node->right);
}
void postorder(Node*node){
if(node->left)
postorder(node->left);
if(node->right)
postorder(node->right);
printf("%d,",node->value);
}
void preorder(Node*node){
printf("%d,",node->value);
if(node->left)
preorder(node->left);
if(node->right)
preorder(node->right);
}
Node*Reverse(Node*root){
Node*temp=root;
if(temp){
Node*t=temp->left;
temp->left=Reverse(temp->right);
temp->right=Reverse(t);
}
return temp;
}
int main(){
clrscr();
int n,x;
Node*root=NULL;
for(;;){
printf("Please Enter a Number for element Place : ");
scanf("%d",&n);
if(n==0)
break;
printf("Please Enter a Number : ");
scanf("%d",&x);
if(!root){
Node*temp=(Node*)malloc(sizeof(Node));
temp->value=x;
temp->left=NULL;
temp->right=NULL;
root=temp;
}else
Insert(n,x,root);
}
printf("\b \ninlorder (LVR) : ");
inorder(root);
printf("\b \npostlorder (LRV) : ");
postorder(root);
printf("\b \nprelorder (VLR) : ");
preorder(root);
printf("\b \b");
root=Reverse(root);
printf("\b \ninlorder (LVR) : ");
inorder(root);
printf("\b \npostlorder (LRV) : ");
postorder(root);
printf("\b \nprelorder (VLR) : ");
preorder(root);
printf("\b \b");
return 0;
}
ما اینجا دو تا برنامه داریم که مربوط به مبحث ساختمان داده هست
69296
اگه امکان داره از اساتید میخوام یک توضیحی در مورد سورس های این دو برنامه بدهند
1-برنامه ای که فرم پرانتزی یک درخت دودویی را به صورت رشته از ورودی خوانده وان را به فرم لیست پیوندی در حافظه پیاده سازی کرده و پیمایش های مختلف ان را چاپ میکند.
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
typedef struct Node{
int value;
Node*left;
Node*right;
};
int inorder(Node*node1,Node*node2){
int x=1;
if(node1->left&&node2->left)
x=x&inorder(node1->left,node2->left);
else
if(node1->left != node2->left)
x=0;
else
x=x&(node1->value==node2->value);
if(node1->right&&node2->right)
x=x&inorder(node1->right,node2->right);
else
if(node1->right != node2->right)
x=0;
return x;
}
int postorder(Node*node1,Node*node2){
int x=1;
if(node1->left&&node2->left)
x=x&&inorder(node1->left,node2->left);
else
if(node1->left != node2->left)
x=0;
if(node1->right&&node2->right)
x=x&&inorder(node1->right,node2->right);
else
if(node1->right != node2->right)
x=0;
x=x&&(node1->value==node2->value);
return x;
}
int preorder(Node*node1,Node*node2){
int x=1;
x=x&(node1->value==node2->value);
if(node1->left&&node2->left)
x=x&inorder(node1->left,node2->left);
else
if(node1->left != node2->left)
x=0;
if(node1->right&&node2->right)
x=x&inorder(node1->right,node2->right);
else
if(node1->right != node2->right)
x=0;
return x;
}
void Insert(int n,int x,Node*root){
Node*temp=root;
int right=0;
for(int h=1;h!=n && temp;){
for(int j=n;j/2>h;j/=2);
if(j==h*2){
if(temp->left)
temp=temp->left;
right=0;
}
if(j==h*2+1){
if(temp->right)
temp=temp->right;
right=1;
}
h=j;
}
Node*t=(Node*)malloc(sizeof(Node));
t->value=x;
t->left=NULL;
t->right=NULL;
if(right)
temp->right=t;
else
temp->left=t;
}
int main(){
clrscr();
int n,x;
Node*root1=NULL,*root2=NULL;
printf("First tree elements ... \n");
for(;;){
printf("Please Enter a Number for element Place : ");
scanf("%d",&n);
if(n==0)
break;
printf("Please Enter a Number : ");
scanf("%d",&x);
if(!root1){
Node*temp=(Node*)malloc(sizeof(Node));
temp->value=x;
temp->left=NULL;
temp->right=NULL;
root1=temp;
}else
Insert(n,x,root1);
}
printf("\nSecond tree elements ... \n");
for(;;){
printf("Please Enter a Number for element Place : ");
scanf("%d",&n);
if(n==0)
break;
printf("Please Enter a Number : ");
scanf("%d",&x);
if(!root2){
Node*temp=(Node*)malloc(sizeof(Node));
temp->value=x;
temp->left=NULL;
temp->right=NULL;
root2=temp;
}else
Insert(n,x,root2);
}
int issame=inorder(root1,root2)&&postorder(root1,root2)&&preorder(root1,root2);
if(issame)
printf("Binary trees are same");
else
printf("Binary trees are not same");
return 0;
}
2-این برنامه تابعی است که زیردرخت های چپ و راست یک درخت را جابه جا میکند(تا اخرین سطح بصورت بازگشتی ).این تابع دربرنامه میاد خروجی را برای یک درخت فرضی(با چاپ پیمایش های درخت اولیه ودرخت حاصل)ازمایش میکند.
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
typedef struct Node{
int value;
Node*left;
Node*right;
};
void Insert(int n,int x,Node*root){
Node*temp=root;
int right=0;
for(int h=1;h!=n && temp;){
for(int j=n;j/2>h;j/=2);
if(j==h*2){
if(temp->left)
temp=temp->left;
right=0;
}
if(j==h*2+1){
if(temp->right)
temp=temp->right;
right=1;
}
h=j;
}
Node*t=(Node*)malloc(sizeof(Node));
t->value=x;
t->left=NULL;
t->right=NULL;
if(right)
temp->right=t;
else
temp->left=t;
}
void inorder(Node*node){
if(node->left)
inorder(node->left);
printf("%d,",node->value);
if(node->right)
inorder(node->right);
}
void postorder(Node*node){
if(node->left)
postorder(node->left);
if(node->right)
postorder(node->right);
printf("%d,",node->value);
}
void preorder(Node*node){
printf("%d,",node->value);
if(node->left)
preorder(node->left);
if(node->right)
preorder(node->right);
}
Node*Reverse(Node*root){
Node*temp=root;
if(temp){
Node*t=temp->left;
temp->left=Reverse(temp->right);
temp->right=Reverse(t);
}
return temp;
}
int main(){
clrscr();
int n,x;
Node*root=NULL;
for(;;){
printf("Please Enter a Number for element Place : ");
scanf("%d",&n);
if(n==0)
break;
printf("Please Enter a Number : ");
scanf("%d",&x);
if(!root){
Node*temp=(Node*)malloc(sizeof(Node));
temp->value=x;
temp->left=NULL;
temp->right=NULL;
root=temp;
}else
Insert(n,x,root);
}
printf("\b \ninlorder (LVR) : ");
inorder(root);
printf("\b \npostlorder (LRV) : ");
postorder(root);
printf("\b \nprelorder (VLR) : ");
preorder(root);
printf("\b \b");
root=Reverse(root);
printf("\b \ninlorder (LVR) : ");
inorder(root);
printf("\b \npostlorder (LRV) : ");
postorder(root);
printf("\b \nprelorder (VLR) : ");
preorder(root);
printf("\b \b");
return 0;
}