先序输出叶结点
本题要求按照先序遍历的顺序输出给定二叉树的叶结点。
输入:二叉树的结构体变量为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]);
}
}
今天学习了一部分关于数组的内容 ,数组的内容并不是很难,但是有些问题逻辑上会有一点饶,我发现在自己写完以后可以去看看别人的思考方向是什么,有时候转换一个思路能得出一个非常清晰简洁的过程。