学习c语言的第十二天

先序输出叶结点

本题要求按照先序遍历的顺序输出给定二叉树的叶结点。

输入:二叉树的结构体变量为BiTree T,其成员是int data(data用来存储二叉树的结点的值),以及 struct Tree *lchild(指针指向二叉树的左孩子), struct Tree *rchild;(指针指向二叉树的右孩子)。

输出:以先序遍历为顺序的叶子结点的值。

优化目标:可能没有优化目标。

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct Tree{
	int data;
	struct Tree *lchild;
	struct Tree *rchild;
}Tree,*BiTree;
BiTree create(){//建树操作
	int num;
	BiTree T;
	scanf("%d",&num);
	if(num==-1){
		return NULL;
	}else{
		T=(BiTree)malloc(sizeof(Tree));
		T->data=num;
		printf("请输入%d的左子树",num);
		T->lchild=create();
		printf("请输入%d的右子树",num);
		T->rchild=create();
		return T;
	}
}
void pre(BiTree T){
	if(T!=NULL){
	    if(T->lchild==NULL&&T->rchild==NULL){//仅当无左右子树时输出
		    printf(" %d",T->data);
	} 
}
	pre(T->lchild);
	pre(T->rchild);
} 
int main(){
	BiTree T=create();
	pre(T);
}

将数组中的数逆序存放 

本题要求编写程序,将给定的n个整数存入数组中,将数组中的这n个数逆序存放,再按顺序输出数组中的元素。

输入:数组的元素个数m,数组的值num。

输出:数组逆序输出的值。

优化目标:可能没有优化目标。

#include<stdlib.h>
#include<stdio.h>
int main(){
	int m;//接收数组中元素个数的值 
	int i; 
	int temp;//用来交换数组的值 
	int num;//接收数组的值 
	scanf("%d",&m);
	int a[m];
	for(i=0;i<m;i++){
		scanf("%d",&num);
		a[i]=num;
	}
	printf("数组正序输出为"); 
	for(i=0;i<m;i++){
	    printf("%d",a[i]);
    }
    for(i=0;i<m/2;i++){
    	temp=a[i];
		a[i]=a[m-1-i];
		a[m-1-i]=temp; 
	}
	printf("数组逆序输出为"); 
	for(i=0;i<m;i++){
	    printf("%d",a[i]);
    }
}

找出两个数组共有的元素

给定两个整型数组,本题要求找出两者共有的元素。

输入:数组a的元素个数m,数组a的值num。数组b的元素个数m,数组b的值num。

输出:a与b数组中相同的值

优化目标:可能没有优化目标。

#include<stdlib.h>
#include<stdio.h>
int main(){
	int m,n;//接收数组中元素个数的值 
	int i,j; 
	int num;//接收数组的值 
	scanf("%d",&m);
	int a[m];
	for(i=0;i<m;i++){
		printf("请输入a[%d]的值",i);
		scanf("%d",&num);
		a[i]=num;
	}
	scanf("%d",&n);
	int b[n];
	for(i=0;i<n;i++){
		printf("请输入b[%d]的值",i);
		scanf("%d",&num);
		b[i]=num;
	}
	printf("相同的值为:"); 
	for(i=0;i<m;i++){
		for(j=0;j<n;j++){
			if(a[i]==b[j]){
				printf("%d ",a[i]);
			}
		}
	}
}

找出两个数组不共有的元素

给定两个整型数组,本题要求找出两者不共有的元素。

输入:数组a的元素个数m,数组a的值num。数组b的元素个数m,数组b的值num。

输出:a与b数组中不相同的值

优化目标:这道题最开始我是打算用一个新的数组c[m+n],用两个循环嵌套查找出两个数组中不共有的所有值,但是在运行以后我发现这种方法会导致不同的数字重复出现,这样的话我接着想可不可以在数组c中直接删除那些相同的元素,再打印c数组的值,但是这种方法也过于繁杂,最后发现可以先找出相同的值,循环扫描数组c和这些相同的值,如果相同就用下一个值覆盖这个相同的值,这样就能得到不重复的且不相同的值。

第一版:

#include<stdlib.h>
#include<stdio.h>
int main(){
	int m,n;//接收数组中元素个数的值 
	int i,j,k,x=0,count=0; 
	int num;//接收数组的值 
	scanf("%d",&m);
	int a[m];
	for(i=0;i<m;i++){
		printf("请输入a[%d]的值",i);
		scanf("%d",&num);
		a[i]=num;
	}
	scanf("%d",&n);
	int b[n];
	for(i=0;i<n;i++){
		printf("请输入b[%d]的值",i);
		scanf("%d",&num);
		b[i]=num;
	}
	int c[m+n];
	for(i=0;i<m;i++){
		for(j=0;j<n;j++){
			if(a[i]!=b[j]){
				c[x]=b[j];
				x++;
			}
		}
	}

	for(i=0;i<x;i++){
		printf(" %d ",c[i]);
		printf("\n");
	}
}

 第二版:

#include<stdlib.h>
#include<stdio.h>
int main(){
	int m,n;//接收数组中元素个数的值 
	int i,j,k,count=0; 
	int x=0;
	int num;//接收数组的值 
	int c[m+n];//接收相同值 
	scanf("%d",&m);
	int a[m];
	for(i=0;i<m;i++){
		printf("请输入a[%d]的值",i);
		scanf("%d",&num);
		a[i]=num;
	}
	scanf("%d",&n);
	int b[n];
	for(i=0;i<n;i++){
		printf("请输入b[%d]的值",i);
		scanf("%d",&num);
		b[i]=num;
	}
	
	printf("相同的值为:"); 
	
	for(i=0;i<m;i++){
		for(j=0;j<n;j++){
			if(a[i]==b[j]){
				c[x]=a[i];
				printf("%d",a[i]);
				x++;//取出相同的值 
			}
		}
	}
	for(i=0;i<n;i++){
		a[m+i]=b[i];//将两个数组合并 
	}
	
	printf("不同的值为:"); 
	
	for(i=0;i<m+n;i++){
		for(j=0;j<x;j++){
			if(a[i]==c[j]){
				for(k=i;k<m+n;k++){
					a[k]=a[k+1];
					count++;
				}
			   
			}
		}
	} 
	for(i=0;i<m+n-count;i++){
			printf("%d",a[i]);
	}
}

今天学习了一部分关于数组的内容 ,数组的内容并不是很难,但是有些问题逻辑上会有一点饶,我发现在自己写完以后可以去看看别人的思考方向是什么,有时候转换一个思路能得出一个非常清晰简洁的过程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值