一道c语言题

Python014

一道c语言题,第1张

/*在楼上Powerwater的辛勤指导下。终于完成了。呵呵。抢分喽~*/

#include<stdio.h>

#include<stdlib.h>

#define LEN sizeof(BSNode)

typedef struct node

{ int datax

struct node *lcd,*rcd

}BSNode

typedef BSNode *BSLink

int total=1

int last=0

void event1(BSNode *p,int x)/*建立二叉排序数*/

{BSNode *q

if(p->datax<x)

if(p->lcd==NULL)

{

q=(BSNode *)malloc(LEN)

q->datax=xq->lcd=NULLq->rcd=NULL

p->lcd=qtotal++

}else event1(p->lcd,x)

else

if(p->rcd==NULL)

{

q=(BSNode *)malloc(LEN)

q->datax=xq->rcd=NULLq->lcd=NULL

p->rcd=qtotal++

}else event1(p->rcd,x)

}

void event2(BSLink tpr,int x)/*遍历相加 */

{

if(tpr!=NULL)

{

tpr->datax=tpr->datax+x

event2(tpr->lcd,x)

event2(tpr->rcd,x)

}

}

void event3(BSLink *tpr,int x)/*传进来根指针tpr本身的地址,二级指针*/

{

BSNode *p

p=*tpr

if(*tpr==NULL)return

if((*tpr)->datax<=x)

{*tpr=(*tpr)->lcdfree(p)event3(tpr,x)}

else if((*tpr)->rcd)

{if((*tpr)->rcd->datax<=x)

{p=(*tpr)->rcd

(*tpr)->rcd=(*tpr)->rcd->lcd

free(p)

event3(tpr,x)}

else (*tpr)->rcd=NULL

}

}

void event4(BSLink tpr,int x,int *a)

{

if(tpr!=NULL)

{

event4(tpr->lcd,x,a)

{(*a)++

if((*a)==x)printf("%d\n",tpr->datax)}

event4(tpr->rcd,x,a)

}

}

void count(BSLink tpr)

{

if(tpr!=NULL)

{ count(tpr->lcd)

last++

count(tpr->rcd)

}

}

int main()

{

int en,t,x

int iint a=0

BSLink tpr=NULL

BSNode *p

scanf("%d",&en)

p=(BSNode *)malloc(LEN)

p->datax=0p->lcd=NULLp->rcd=NULL

tpr=p

for(i=0i<eni++)

{

scanf("%d %d",&t,&x)

switch(t)

{

case 1 :event1(p,x)break

case 2 :event2(tpr,x)break

case 3 :

event3(&tpr,x)

count(tpr)

printf("%d\n",total-last)

break

case 4 :a=0event4(tpr,x,&a)if(x>a)printf("-1")break

default:printf("ERROE INPUT!")

}

}

system("pause")

return 0

}

刚刚回答了一个类似的问题,以下代码供参考:

#include "stdio.h"

#include "stdlib.h"

#define OK 1

#define ERROR 0

#define OVERFLOW -2

typedef char TElemType

typedef int Status

typedef struct BiTNode { // 结点结构

TElemType data

struct BiTNode *lchild, *rchild

// 左右孩子指针

} BiTNode, *BiTree

//以下是建立二叉树存储结构,空节点输入作为#结束标识

Status CreateBiTree(BiTree &T) {

//请将该算法补充完整,参见第6章课件算法或课本

char ch

scanf("%c",&ch)

if(ch=='#') T=NULL

else{

if(!(T=(BiTNode*)malloc(sizeof(BiTNode))))

exit(OVERFLOW)

T->data=ch

CreateBiTree(T->lchild)

CreateBiTree(T->rchild)

}

return OK

} // CreateBiTree

void Preorder(BiTree T)

{

if(T)

{

printf("%c",T->data)

Preorder(T->lchild)

Preorder(T->rchild)

}

}

void Inorder(BiTree T)

{ // 中序遍历二叉树

//请将该算法补充完整,参见第6章课件算法

if(T)

{

Inorder(T->lchild)

printf("%c",T->data)

Inorder(T->rchild)

}

}

void Postorder(BiTree T)

{ // 后序遍历二叉树

//请将该算法补充完整,参见第6章课件算法

if(T)

{

Postorder(T->lchild)

Postorder(T->rchild)

printf("%c",T->data)

}

}

//以下是求叶子结点数

void CountLeaf(BiTree T,int&count){

//请将该算法补充完整,参见第6章课件算法

if(T){

if((!T->lchild)&&(!T->rchild))

count++

CountLeaf(T->lchild,count)

CountLeaf(T->rchild,count)

}

}

//以下是求二叉树的深度

int Depth(BiTree T ){

//请将该算法补充完整,参见第6章课件算法

int depthval,depthLeft,depthRight

if(!T) depthval=0

else{

depthLeft = Depth(T->lchild)

depthRight = Depth(T->rchild)

if(depthLeft>depthRight)depthval = 1+depthLeft

else depthval = 1+depthRight

}

return depthval

}

void main(){

BiTree T

int s=0,d

printf("\n creat of the bitree:\n")

CreateBiTree(T)

printf("\n output result of Preorder:\n")

Preorder(T)

CountLeaf(T,s)

d=Depth(T)

printf("\n leaves=%d\n",s)

printf("\n depth=%d\n",d)

}

数据结构我认为主要有三个方面。

1:抽象解释。

首先根据某个结构,利用自然语言进行描述,然后才能体现到代码上,如果你抽象解释看不懂,说明你的的数学知识不牢固,可以复习高中数学必修3中讲程序的那一节。

2:流程图。

根据自然语言的描述,把他体现在流程图上,注意流程图是学习数据结构的关键,数据结构不难,但很烦,他需要推理,往往一种情况又分另一种,红黑树就是一个例子。初期学习链表什么的较简单,但也不能忽略基础。

3:代码实现

有了流程图就万事具备了吗,NO。代码实现是一个大头,因为抽象,所以忽略了细节,往往这些细节能让你很头疼,比如选用什么数据类型,参数是引用,指针,常量等等?所以这里体现了你的代码操纵能力。