① 设计一个c语言程序,实现二叉树的前序、中序、后序的递归、非递归遍历运算

#include<malloc.h> // malloc()等
#include<stdio.h> // 标准输入输出头文件,包括EOF(=^Z或F6),NULL等
#include<stdlib.h> // atoi(),exit()
#include<math.h> // 数学函数头文件,包括floor(),ceil(),abs()等

#define ClearBiTree DestroyBiTree // 清空二叉树和销毁二叉树的操作一样

typedef struct BiTNode
{
int data; // 结点的值
BiTNode *lchild,*rchild; // 左右孩子指针
}BiTNode,*BiTree;

int Nil=0; // 设整型以0为空
void visit(int e)
{ printf("%d ",e); // 以整型格式输出
}
void InitBiTree(BiTree &T)
{ // 操作结果:构造空二叉树T
T=NULL;
}

void CreateBiTree(BiTree &T)
{ // 算法6.4:按先序次序输入二叉树中结点的值(可为字符型或整型,在主程中定义),
// 构造二叉链表表示的二叉树T。变量Nil表示空(子)树。修改
int number;
scanf("%d",&number); // 输入结点的值
if(number==Nil) // 结点的值为空
T=NULL;
else // 结点的值不为空
{ T=(BiTree)malloc(sizeof(BiTNode)); // 生成根结点
if(!T)
exit(OVERFLOW);
T->data=number; // 将值赋给T所指结点
CreateBiTree(T->lchild); // 递归构造左子树
CreateBiTree(T->rchild); // 递归构造右子树
}
}

void DestroyBiTree(BiTree &T)
{ // 初始条件:二叉树T存在。操作结果:销毁二叉树T
if(T) // 非空树
{ DestroyBiTree(T->lchild); // 递归销毁左子树,如无左子树,则不执行任何操作
DestroyBiTree(T->rchild); // 递归销毁右子树,如无右子树,则不执行任何操作
free(T); // 释放根结点
T=NULL; // 空指针赋0
}
}

void PreOrderTraverse(BiTree T,void(*Visit)(int))
{ // 初始条件:二叉树T存在,Visit是对结点操作的应用函数。修改算法6.1
// 操作结果:先序递归遍历T,对每个结点调用函数Visit一次且仅一次
if(T) // T不空
{ Visit(T->data); // 先访问根结点
PreOrderTraverse(T->lchild,Visit); // 再先序遍历左子树
PreOrderTraverse(T->rchild,Visit); // 最后先序遍历右子树
}
}

void InOrderTraverse(BiTree T,void(*Visit)(int))
{ // 初始条件:二叉树T存在,Visit是对结点操作的应用函数
// 操作结果:中序递归遍历T,对每个结点调用函数Visit一次且仅一次
if(T)
{ InOrderTraverse(T->lchild,Visit); // 先中序遍历左子树
Visit(T->data); // 再访问根结点
InOrderTraverse(T->rchild,Visit); // 最后中序遍历右子树
}
}

void PostOrderTraverse(BiTree T,void(*Visit)(int))
{ // 初始条件:二叉树T存在,Visit是对结点操作的应用函数
// 操作结果:后序递归遍历T,对每个结点调用函数Visit一次且仅一次
if(T) // T不空
{ PostOrderTraverse(T->lchild,Visit); // 先后序遍历左子树
PostOrderTraverse(T->rchild,Visit); // 再后序遍历右子树
Visit(T->data); // 最后访问根结点

}
}

void main()
{
BiTree T;
InitBiTree(T); // 初始化二叉树T
printf("按先序次序输入二叉树中结点的值,输入0表示节点为空,输入范例:1 2 0 0 3 0 0\n");
CreateBiTree(T); // 建立二叉树T
printf("先序递归遍历二叉树: ");
PreOrderTraverse(T,visit); // 先序递归遍历二叉树T
printf("\n中序递归遍历二叉树: ");
InOrderTraverse(T,visit); // 中序递归遍历二叉树T
printf(" \n后序递归遍历二叉树:");
PostOrderTraverse(T,visit); // 后序递归遍历二叉树T
printf("\n");
}

② 用c语言实现二叉树的程序,可以输入输出和遍历

#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>

const int MaxLength=10;//结点个数不超过10个

typedef struct tree
{
char data;
struct tree *lchild,*rchild;
}tree;
//先序递归 建立二叉树
void Createbitree(tree* &T)
{
char ch;
ch=getchar();
if(ch=='#')
T=NULL;
else
{
T=(tree*)malloc(sizeof(tree));
T->data =ch;
Createbitree(T->lchild );
Createbitree(T->rchild );
}
}
//先序递归遍历
void PreOrderTraverse(tree* T)
{
if(T)
{
cout<<T->data;
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
//中序递归遍历
void InOrderTraverse(tree* T)
{
if(T)
{
InOrderTraverse(T->lchild);
cout<<T->data;
InOrderTraverse(T->rchild);
}
}
void PostOrderTraverse(tree* T)
{
if(T)
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
cout<<T->data;
}
}
//层序遍历
void LevelOrderTraverse(tree* T)
{
tree* Q[MaxLength];
int front=0,rear=0;
tree* p;
if(T)//根结点入队
{
Q[rear]=T;
rear=(rear+1)%MaxLength;
}
while(front!=rear)
{
p=Q[front]; //队头元素出队
front=(front+1)%MaxLength;
cout<<p->data;
if(p->lchild)//左孩子不为空,入队
{
Q[rear]=p->lchild;
rear=(rear+1)%MaxLength;
}
if(p->rchild)//右孩子不为空,入队
{
Q[rear]=p->rchild;
rear=(rear+1)%MaxLength;
}
}
}
//主函数
void main()
{
cout<<"请按先序次序输入二叉树的数据:"<<endl;
tree* T;
Createbitree(T);
cout<<"二叉树的先序序列为:"<<endl;
PreOrderTraverse(T);
cout<<endl<<"二叉树的中序序列为:"<<endl;
InOrderTraverse(T);
cout<<endl<<"二叉树的后序序列为:"<<endl;
PostOrderTraverse(T);
cout<<endl<<"二叉树的层序序列为:"<<endl;
LevelOrderTraverse(T);
cout<<endl;
}
比如 1
2 3
4 5 6 7
按先序输入是124##5##36##7##

③ C语言编程显示如下的金字塔树: * *** * *** ***** * *** ***** ******* | ===V===

#include<stdio.h>

voidmain()
{
inti,j,n;
printf("Input Pleaseinputn: ");
scanf("%d",&n);
printf("Output: ");
for(i=1;i<=n+1;i++)
{
for(j=1;j<=n+1-i;j++)
printf("");
for(j=1;j<=2*i-1;j++)
printf("#");
printf(" ");
}
for(i=n;i>0;i--)
{
for(j=n-i;j>=0;j--)
printf("");
for(j=2*i-2;j>=0;j--)
printf("#");
printf(" ");
}
}

④ C语言二叉树的建立完整程序谢谢!!!

C语言二叉树的建立?完整程序?谢谢!!!
d.cpp
C:\Documents and Settings\Administrator\桌面\dsd.cpp(21) : error C2664: 'Init' : cannot convert parameter 1 from 'struct node *' to 'Tree *'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
C:\Documents and Settings\Administrator\桌面\dsd.cpp(22) : error C2664: 'Init' : cannot convert parameter 1 from 'struct node *' to 'Tree *'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
C:\Documents and Settings\Administrator\桌面\dsd.cpp(31) : error C2664: 'Xbl' : cannot convert parameter 1 from 'struct node *' to 'Tree *'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
C:\Documents and Settings\Administrator\桌面\dsd.cpp(32) : error C2664: 'Xbl' : cannot convert parameter 1 from 'struct node *' to 'Tree *'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
执行 cl.exe 时出错.

dsd.obj - 1 error(s), 0 warning(s)
VC6 .0报错!

⑤ 完整正确的C语言二叉树程序

#include<iostream>
using namespace std;
class Node
{
private:
char data;
Node* left;
Node* right;
public:
Node(int index,Node* lptr=NULL,Node* rptr=NULL)
{
data=index;
left=lptr;
right=rptr;
}
~Node(){}
Node* Getleft(){return left;}
void Setleft(Node* l){left=l;}
Node* Getright(){return right;}
void Setright(Node* r){right=r;}
char& Getdata(){return data;}
void Setdata(const int& index){data=index;}
friend class BinTree;
};
class BinTree
{
private:
Node* root;
char stop;
public:
BinTree(Node* t=NULL){root=t;}
virtual ~BinTree(){Del(root);};

Node* Father(Node* t,Node* p);//在以t为根的子树中寻找p的父结点

Node* Find(Node* t,const char& item)const;//在以t为根的子树中寻找data域为item的结点

void DelSubTree(Node* t);//从树中删除节点t及其左右子树
void Del(Node* t);//删除节点t及其左右子树

void Preorder(Node* t)const;//先根
void InOrder(Node* t)const;//中根
void PostOrder(Node* t)const;//后根
void LeverOrder(Node* t,Node**& b,int& length);//层次遍历

void CreatBinTree(int tostop);//创建二叉树
Node* Creat();

Node* GetRoot(){return root;}
void SetRoot(Node* t){root=t;}
int GetStop(){return stop;}
void SetStop(char tostop){stop=tostop;}
int IsEmpty(){return root==NULL?1:0;}

bool Comptree(Node* t);

};

//先根创建二叉树
void BinTree::CreatBinTree(int tostop)
{
SetStop(tostop);cout<<"根节点是:";
root=Creat();cout<<endl;

}
Node* BinTree::Creat()
{
Node* t,*t1,*t2;
char item;cin>>item;
if(item==stop){t=NULL;return t;}
else
{
if(!(t=new Node(item,NULL,NULL))) return NULL;
cout<<item<<"左儿子是:";t1=Creat();
t->Setleft(t1);
cout<<item<<"右儿子是:";t2=Creat();
t->Setright(t2);
return t;
}
}

//先根遍历输出二叉树
void BinTree::Preorder(Node* t)const
{
//if(t==NULL) return;
if(t!=NULL)
{
cout<<t->Getdata()<<" ";
Preorder(t->Getleft());
Preorder(t->Getright());
}

}

int main()
{

LinkedList l1;
cout<<"1.InsertFront(item)"<<endl;
cout<<"2.InsertRear(item)"<<endl;
cout<<"3.InsertAt(item)"<<endl;
cout<<"4.DeleteFont()"<<endl;
cout<<"5.DeleteRear()"<<endl;
cout<<"6.DeleteAt()"<<endl;
cout<<"7.Search(int& item)"<<endl;
cout<<"8.Find(int k,int &item)"<<endl;
cout<<"9.FindCur(item)"<<endl;
cout<<"10.Print()"<<endl;

cout<<"请选择操作:";

int c=0;
while(cin>>c){
switch(c)
{
case 1:{
cout<<"请输入要插入的数:";
int a;
cin>>a;
l1.InsertFront(a);
}
break;

case 2:{
cout<<"请输入要插入的数:";
int a;
cin>>a;
l1.InsertRear(a);
}
break;

case 3:{
cout<<"请输入要插入的数:";
int a;
cin>>a;
l1.InsertAt(a);
}
break;

case 4:
{
l1.DeleteFront();
}
break;
case 5:
{
l1.DeleteRear();
}
break;

case 6:
{
l1.DeleteAt();
}
break;

case 7:{
cout<<"请输入要查找的数:";
int a;
cin>>a;
int b=l1.Search(a);
cout<<"要查找的数的位置是:"<<b<<endl;
}
break;

case 8:{
cout<<"请输入要查找位置:";
int a;
cin>>a;
int b;l1.Find(a,b);
cout<<"要查找的数是:"<<b<<endl;
}
break;

case 9:{

int b;l1.FindCur(b);
cout<<"要查找的数的位置是:"<<b<<endl;
}
break;

case 10:
l1.Print();
break;

}

cout<<"请选择操作:";

}

return 0;
}

看着不需要的地方删掉就行 创建二叉树有标注,我的是以'#'结尾的 改下就可以了

⑥ c语言程序设计生成树

生成什么树

⑦ 求一个用c语言实现二叉树的非递归中序遍历完整程序。(用栈实现)。谢谢!

//但是你栈从哪里来。。。。自己写一个吗
voidInOrderRecur(Tree*tree)
{
while(!sta.empty())sta.pop();
while(!sta.empty()||tree!=NULL)
{
if(tree==NULL)
{
Tree*cur=sta.top();
sta.pop();
cout<<cur->data<<"";
tree=cur->rson;
}else{
sta.push(tree);
tree=tree->lson;
}
}
}
  • 1.申请一个栈,头结点为开始节点(当前节点)

  • 2.如果当前节点不为空,那么将左节点压栈,即做tree=tree->lson操作,如果当前节点为空的时候打印栈顶元素,并且出栈,将 当前节点变为栈顶元素的右节点也就是做tree = cur->rson(中序遍历中,栈主要保存的是父节点元素)

  • 3.不断重复步骤2直到栈空,结束程序!

⑧ 用c语言如何编写一个关于事故树的程序

#include <stdio.h>
#include <stdlib.h>
#define STACK_MAX_SIZE 30
#define QUEUE_MAX_SIZE 30
#ifndef elemType
typedef char elemType;
#endif
/************************************************************************/
/* 以下是关于二叉树操作的11个简单算法 */
/************************************************************************/
struct BTreeNode{
elemType data;
struct BTreeNode *left;
struct BTreeNode *right;
};
/* 1.初始化二叉树 */
void initBTree(struct BTreeNode* *bt)
{
*bt = NULL;
return;
}
/* 2.建立二叉树(根据a所指向的二叉树广义表字符串建立) */
void createBTree(struct BTreeNode* *bt, char *a)
{
struct BTreeNode *p;
struct BTreeNode *s[STACK_MAX_SIZE];/* 定义s数组为存储根结点指针的栈使用 */
int top = -1; /* 定义top作为s栈的栈顶指针,初值为-1,表示空栈 */
int k; /* 用k作为处理结点的左子树和右子树,k = 1处理左子树,k = 2处理右子树 */
int i = 0; /* 用i扫描数组a中存储的二叉树广义表字符串,初值为0 */
*bt = NULL; /* 把树根指针置为空,即从空树开始建立二叉树 */
/* 每循环一次处理一个字符,直到扫描到字符串结束符\0为止 */
while(a[i] != '\0'){
switch(a[i]){
case ' ':
break; /* 对空格不作任何处理 */
case '(':
if(top == STACK_MAX_SIZE - 1){
printf("栈空间太小!\n");
exit(1);
}
top++;
s[top] = p;
k = 1;
break;
case ')':
if(top == -1){
printf("二叉树广义表字符串错误!\n");
exit(1);
}
top--;
break;
case ',':
k = 2;
break;
default:
p = new BTreeNode ;
p->data = a[i];
p->left = p->right = NULL;
if(*bt == NULL){
*bt = p;
}else{
if( k == 1){
s[top]->left = p;
}else{
s[top]->right = p;
}
}
}
i++; /* 为扫描下一个字符修改i值 */
}
return;
}
/* 3.检查二叉树是否为空,为空则返回1,否则返回0 */
int emptyBTree(struct BTreeNode *bt)
{
if(bt == NULL){
return 1;
}else{
return 0;
}
}
/* 4.求二叉树深度 */
int BTreeDepth(struct BTreeNode *bt)
{
if(bt == NULL){
return 0; /* 对于空树,返回0结束递归 */
}else{
int dep1 = BTreeDepth(bt->left); /* 计算左子树的深度 */
int dep2 = BTreeDepth(bt->right); /* 计算右子树的深度 */
if(dep1 > dep2){
return dep1 + 1;
}else{
return dep2 + 1;
}
}
}
/* 5.从二叉树中查找值为x的结点,若存在则返回元素存储位置,否则返回空值 */
elemType *findBTree(struct BTreeNode *bt, elemType x)
{
if(bt == NULL){
return NULL;
}else{
if(bt->data == x){
return &(bt->data);
}else{ /* 分别向左右子树递归查找 */
elemType *p;
if(p = findBTree(bt->left, x)){
return p;
}
if(p = findBTree(bt->right, x)){
return p;
}
return NULL;
}
}
}
/* 6.输出二叉树(前序遍历) */
void printBTree(struct BTreeNode *bt)
{
/* 树为空时结束递归,否则执行如下操作 */
if(bt != NULL){
printf("%c", bt->data); /* 输出根结点的值 */
if(bt->left != NULL || bt->right != NULL){
printf("(");
printBTree(bt->left);
if(bt->right != NULL){
printf(",");
}
printBTree(bt->right);
printf(")");
}
}
return;
}
/* 7.清除二叉树,使之变为一棵空树 */
void clearBTree(struct BTreeNode* *bt)
{
if(*bt != NULL){
clearBTree(&((*bt)->left));
clearBTree(&((*bt)->right));
free(*bt);
*bt = NULL;
}
return;
}
/* 8.前序遍历 */
void preOrder(struct BTreeNode *bt)
{
if(bt != NULL){
printf("%c ", bt->data); /* 访问根结点 */
preOrder(bt->left); /* 前序遍历左子树 */
preOrder(bt->right); /* 前序遍历右子树 */
}
return;
}
/* 9.前序遍历 */
void inOrder(struct BTreeNode *bt)
{
if(bt != NULL){
inOrder(bt->left); /* 中序遍历左子树 */
printf("%c ", bt->data); /* 访问根结点 */
inOrder(bt->right); /* 中序遍历右子树 */
}
return;
}
/* 10.后序遍历 */
void postOrder(struct BTreeNode *bt)
{
if(bt != NULL){
postOrder(bt->left); /* 后序遍历左子树 */
postOrder(bt->right); /* 后序遍历右子树 */
printf("%c ", bt->data); /* 访问根结点 */
}
return;
}
/* 11.按层遍历 */
void levelOrder(struct BTreeNode *bt)
{
struct BTreeNode *p;
struct BTreeNode *q[QUEUE_MAX_SIZE];
int front = 0, rear = 0;
/* 将树根指针进队 */
if(bt != NULL){
rear = (rear + 1) % QUEUE_MAX_SIZE;
q[rear] = bt;
}
while(front != rear){ /* 队列非空 */
front = (front + 1) % QUEUE_MAX_SIZE; /* 使队首指针指向队首元素 */
p = q[front];
printf("%c ", p->data);
/* 若结点存在左孩子,则左孩子结点指针进队 */
if(p->left != NULL){
rear = (rear + 1) % QUEUE_MAX_SIZE;#include <stdio.h>
#include <stdlib.h>
#define STACK_MAX_SIZE 30
#define QUEUE_MAX_SIZE 30
#ifndef elemType
typedef char elemType ;
#endif
/************************************************************************/
/* 以下是关于二叉树操作的11个简单算法 */
/************************************************************************/
struct BTreeNode{
elemType data ;
struct BTreeNode *left ;
struct BTreeNode *right ;
};
/* 1.初始化二叉树 */
void initBTree(struct BTreeNode* *bt)
{
*bt = NULL ;
return ;
}
/* 2.建立二叉树(根据a所指向的二叉树广义表字符串建立) */
void createBTree(struct BTreeNode* *bt, char *a)
{
struct BTreeNode *p;
struct BTreeNode *s[STACK_MAX_SIZE];/* 定义s数组为存储根结点指针的栈使用 */
int top = -1; /* 定义top作为s栈的栈顶指针,初值为-1,表示空栈 */
int k ; /* 用k作为处理结点的左子树和右子树,k = 1处理左子树,k = 2处理右子树 */
int i = 0 ; /* 用i扫描数组a中存储的二叉树广义表字符串,初值为0 */
*bt = NULL ; /* 把树根指针置为空,即从空树开始建立二叉树 */
/* 每循环一次处理一个字符,直到扫描到字符串结束符\0为止 */
while(a[i] != '\0')
{
switch(a[i])
{
case ' ':
break; /* 对空格不作任何处理 */
case '(':
if( top == STACK_MAX_SIZE - 1 )
{
printf("栈空间太小!\n") ;
exit(1) ;
}
top++ ;
s[top] = p ;
k = 1 ;
break;
case ')':
if(top == -1){
printf("二叉树广义表字符串错误!\n");
exit(1);
}
top-- ;
break ;
case ',':
k = 2;
break;
default:
p = new BTreeNode ;
p->data = a[i] ;
p->left = p->right = NULL ;
if( *bt == NULL){
*bt = p ;
}
else{
if( k == 1){
s[top]->left = p ;
}
else{
s[top]->right = p ;
}
}
}
i++ ; /* 为扫描下一个字符修改i值 */
}
return;
}
/* 3.检查二叉树是否为空,为空则返回1,否则返回0 */
int emptyBTree(struct BTreeNode *bt)
{
if(bt == NULL){
return 1;
}
else{
return 0;
}
}
/* 4.求二叉树深度 */
int BTreeDepth(struct BTreeNode *bt)
{
if(bt == NULL){
return 0; /* 对于空树,返回0结束递归 */
}
else{
int dep1 = BTreeDepth(bt->left); /* 计算左子树的深度 */
int dep2 = BTreeDepth(bt->right); /* 计算右子树的深度 */
if(dep1 > dep2){
return dep1 + 1;
}
else{
return dep2 + 1;
}
}
}
/* 5.从二叉树中查找值为x的结点,若存在则返回元素存储位置,否则返回空值 */
elemType *findBTree(struct BTreeNode *bt, elemType x)
{
if(bt == NULL){
return NULL;
}
else{
if(bt->data == x){
return &(bt->data);
}
else{ /* 分别向左右子树递归查找 */
elemType *p ;
if(p = findBTree(bt->left, x)){
return p ;
}
if(p = findBTree(bt->right, x)){
return p ;
}
return NULL ;
}
}
}
/* 6.输出二叉树(前序遍历) */
void printBTree(struct BTreeNode *bt)
{
/* 树为空时结束递归,否则执行如下操作 */
if(bt != NULL)
{
printf("%c ", bt->data); /* 输出根结点的值 */
if(bt->left != NULL || bt->right != NULL)
{
printf("(") ;
printBTree(bt->left) ;
if(bt->right != NULL)
{
printf(",") ;
}
printBTree(bt->right) ;
printf(")");
}
}
return;
}
/* 7.清除二叉树,使之变为一棵空树 */
void clearBTree(struct BTreeNode* *bt)
{
if(*bt != NULL){
clearBTree(&((*bt)->left)) ;
clearBTree(&((*bt)->right)) ;
free(*bt) ;
*bt = NULL ;
}
return ;
}
/* 8.前序遍历 */
void preOrder(struct BTreeNode *bt)
{
if(bt != NULL){
printf("%c ", bt->data) ; /* 访问根结点 */
preOrder(bt->left) ; /* 前序遍历左子树 */
preOrder(bt->right) ; /* 前序遍历右子树 */
}
return ;
}
/* 9.中序遍历 */
void inOrder(struct BTreeNode *bt)
{
if(bt != NULL){
inOrder(bt->left); /* 中序遍历左子树 */
printf("%c ", bt->data); /* 访问根结点 */
inOrder(bt->right); /* 中序遍历右子树 */
}
return;
}
/* 10.后序遍历 */
void postOrder(struct BTreeNode *bt)
{
if(bt != NULL){
postOrder(bt->left); /* 后序遍历左子树 */
postOrder(bt->right); /* 后序遍历右子树 */
printf("%c ", bt->data); /* 访问根结点 */
}
return;
}
/* 11.按层遍历 */
void levelOrder(struct BTreeNode *bt)
{
struct BTreeNode *p;
struct BTreeNode *q[QUEUE_MAX_SIZE];
int front = 0, rear = 0;
/* 将树根指针进队 */
if(bt != NULL){
rear = (rear + 1) % QUEUE_MAX_SIZE;
q[rear] = bt;
}
while(front != rear){ /* 队列非空 */
front = (front + 1) % QUEUE_MAX_SIZE; /* 使队首指针指向队首元素 */
p = q[front];
printf("%c ", p->data);
/* 若结点存在左孩子,则左孩子结点指针进队 */
if(p->left != NULL){
rear = (rear + 1) % QUEUE_MAX_SIZE;
q[rear] = p->left;
}
/* 若结点存在右孩子,则右孩子结点指针进队 */
if(p->right != NULL){
rear = (rear + 1) % QUEUE_MAX_SIZE;
q[rear] = p->right;
}
}
return;
}
/************************************************************************/
int main(int argc, char *argv[])
{
struct BTreeNode *bt ; /* 指向二叉树根结点的指针 */
char *b ; /* 用于存入二叉树广义表的字符串 */
elemType x, *px ;
initBTree(&bt) ;
printf("输入二叉树广义表的字符串:\n") ;
/* scanf("%s", b); */
b = "a(b(c), d(e(f, g), h(, i)))" ; //////其中不在括号中的字符表示 的是根节点括号中的分别是左右儿子
createBTree(&bt, b) ;
if(bt != NULL)
printf(" %c ", bt->data) ;
printf("以广义表的形式输出:\n") ;
printBTree(bt); /* 以广义表的形式输出二叉树 */
printf("\n");
printf("前序:"); /* 前序遍历 */
preOrder(bt);
printf("\n");
printf("中序:"); /* 中序遍历 */
inOrder(bt);
printf("\n");
printf("后序:"); /* 后序遍历 */
postOrder(bt);
printf("\n");
printf("按层:"); /* 按层遍历 */
levelOrder(bt);
printf("\n");
/* 从二叉树中查找一个元素结点 */
printf("输入一个待查找的字符:\n");
scanf(" %c", &x); /* 格式串中的空格跳过空白字符 */
px = findBTree(bt, x);
if(px){
printf("查找成功:%c\n", *px);
}else{
printf("查找失败!\n");
}
printf("二叉树的深度为:");
printf("%d\n", BTreeDepth(bt));
clearBTree(&bt);
return 0;
}

⑨ C语言如何创建并发进程

  1. WIN32API函数CreateProcess用来创建一个新的进程和它的主线程,这个新进程运行指定的可执行文件。

    函数原型:


    BOOL CreateProcess
    (
    LPCTSTR lpApplicationName,
    LPTSTR lpCommandLine,
    LPSECURITY_ATTRIBUTES lpProcessAttributes。
    LPSECURITY_ATTRIBUTES lpThreadAttributes,
    BOOL bInheritHandles,
    DWORD dwCreationFlags,
    LPVOID lpEnvironment,
    LPCTSTR lpCurrentDirectory,
    LPSTARTUPINFO lpStartupInfo,
    LPPROCESS_
    );

    参数:

    lpApplicationName
    指向一个NULL结尾的、用来指定可执行模块的字符串。
    这个字符串可以是可执行模块的绝对路径,也可以是相对路径,在后一种情况下,函数使用当前驱动器和目录建立可执行模块的路径。
    这个参数可以被设为NULL,在这种情况下,可执行模块的名字必须处于 lpCommandLine 参数最前面并由空格符与后面的字符分开。
    lpCommandLine
    指向一个以NULL结尾的字符串,该字符串指定要执行的命令行。
    这个参数可以为空,那么函数将使用lpApplicationName参数指定的字符串当做要运行的程序的命令行。
    如果lpApplicationName和lpCommandLine参数都不为空,那么lpApplicationName参数指定将要被运行的模块,lpCommandLine参数指定将被运行的模块的命令行。新运行的进程可以使用GetCommandLine函数获得整个命令行。C语言程序可以使用argc和argv参数。
    lpProcessAttributes
    指向一个SECURITY_ATTRIBUTES结构体,这个结构体决定是否返回的句柄可以被子进程继承。如果lpProcessAttributes参数为空(NULL),那么句柄不能被继承。
    在Windows NT中:SECURITY_ATTRIBUTES结构的lpSecurityDescriptor成员指定了新进程的安全描述符,如果参数为空,新进程使用默认的安全描述符。
    lpThreadAttributes
    同lpProcessAttribute,不过这个参数决定的是线程是否被继承.通常置为NULL.
    bInheritHandles
    指示新进程是否从调用进程处继承了句柄。
    如果参数的值为真,调用进程中的每一个可继承的打开句柄都将被子进程继承。被继承的句柄与原进程拥有完全相同的值和访问权限。
    dwCreationFlags
    指定附加的、用来控制优先类和进程的创建的标志。以下的创建标志可以以除下面列出的方式外的任何方式组合后指定。
    ⑴值:CREATE_DEFAULT_ERROR_MODE
    含义:新的进程不继承调用进程的错误模式。CreateProcess函数赋予新进程当前的默认错误模式作为替代。应用程序可以调用SetErrorMode函数设置当前的默认错误模式。
    这个标志对于那些运行在没有硬件错误环境下的多线程外壳程序是十分有用的。
    对于CreateProcess函数,默认的行为是为新进程继承调用者的错误模式。设置这个标志以改变默认的处理方式。
    ⑵值:CREATE_NEW_CONSOLE
    含义:新的进程将使用一个新的控制台,而不是继承父进程的控制台。这个标志不能与DETACHED_PROCESS标志一起使用。
    ⑶值:CREATE_NEW_PROCESS_GROUP
    含义:新进程将是一个进程树的根进程。进程树中的全部进程都是根进程的子进程。新进程树的用户标识符与这个进程的标识符是相同的,由lpProcessInformation参数返回。进程树经常使用GenerateConsoleCtrlEvent函数允许发送CTRL+C或CTRL+BREAK信号到一组控制台进程。
    ⑷值:CREATE_SEPARATE_WOW_VDM
    如果被设置,新进程将会在一个私有的虚拟DOS机(VDM)中运行。另外,默认情况下所有的16位Windows应用程序都会在同一个共享的VDM中以线程的方式运行。单独运行一个16位程序的优点是一个应用程序的崩溃只会结束这一个VDM的运行;其他那些在不同VDM中运行的程序会继续正常的运行。同样的,在不同VDM中运行的16位Windows应用程序拥有不同的输入队列,这意味着如果一个程序暂时失去响应,在独立的VDM中的应用程序能够继续获得输入。
    ⑸值:CREATE_SHARED_WOW_VDM
    如果WIN.INI中的Windows段的DefaultSeparateVDM选项被设置为真,这个标识使得CreateProcess函数越过这个选项并在共享的虚拟DOS机中运行新进程。
    ⑹值:CREATE_SUSPENDED
    含义:新进程的主线程会以暂停的状态被创建,直到调用ResumeThread函数被调用时才运行。
    ⑺值:CREATE_UNICODE_ENVIRONMENT
    含义:如果被设置,由lpEnvironment参数指定的环境块使用Unicode字符,如果为空,环境块使用ANSI字符。
    ⑻值:DEBUG_PROCESS
    含义:如果这个标志被设置,调用进程将被当做一个调试程序,并且新进程会被当做被调试的进程。系统把被调试程序发生的所有调试事件通知给调试器。
    如果你使用这个标志创建进程,只有调用进程(调用CreateProcess函数的进程)可以调用WaitForDebugEvent函数。
    ⑼值:DEBUG_ONLY_THIS_PROCESS
    含义:如果此标志没有被设置且调用进程正在被调试,新进程将成为调试调用进程的调试器的另一个调试对象。如果调用进程没有被调试,有关调试的行为就不会产生。
    ⑽值:DETACHED_PROCESS
    含义:对于控制台进程,新进程没有访问父进程控制台的权限。新进程可以通过AllocConsole函数自己创建一个新的控制台。这个标志不可以与CREATE_NEW_CONSOLE标志一起使用。
    〔11〕值:CREATE_NO_WINDOW
    含义:系统不为新进程创建CUI窗口,使用该标志可以创建不含窗口的CUI程序。
    dwCreationFlags参数
    还用来控制新进程的优先类,优先类用来决定此进程的线程调度的优先级。如果下面的优先级类标志都没有被指定,那么默认的优先类是NORMAL_PRIORITY_CLASS,除非被创建的进程是IDLE_PRIORITY_CLASS。在这种情况下子进程的默认优先类是IDLE_PRIORITY_CLASS。
    可以选择下面的标志中的一个:
    优先级:HIGH_PRIORITY_CLASS
    含义:指示这个进程将执行时间临界的任务,所以它必须被立即运行以保证正确。这个优先级的程序优先于正常优先级或空闲优先级的程序。一个例子是Windows任务列表,为了保证当用户调用时可以立刻响应,放弃了对系统负荷的考虑。确保在使用高优先级时应该足够谨慎,因为一个高优先级的CPU关联应用程序可以占用几乎全部的CPU可用时间。
    优先级:IDLE_PRIORITY_CLASS
    含义:指示这个进程的线程只有在系统空闲时才会运行并且可以被任何高优先级的任务打断。例如屏幕保护程序。空闲优先级会被子进程继承。
    优先级:NORMAL_PRIORITY_CLASS
    含义:指示这个进程没有特殊的任务调度要求。
    优先级:REALTIME_PRIORITY_CLASS
    含义:指示这个进程拥有可用的最高优先级。一个拥有实时优先级的进程的线程可以打断所有其他进程线程的执行,包括正在执行重要任务的系统进程。例如,一个执行时间稍长一点的实时进程可能导致磁盘缓存不足或鼠标反映迟钝。
    lpEnvironment
    指向一个新进程的环境块。如果此参数为空,新进程使用调用进程的环境。
    一个环境块存在于一个由以NULL结尾的字符串组成的块中,这个块也是以NULL结尾的。每个字符串都是name=value的形式。
    因为相等标志被当做分隔符,所以它不能被环境变量当做变量名。
    与其使用应用程序提供的环境块,不如直接把这个参数设为空,系统驱动器上的当前目录信息不会被自动传递给新创建的进程。对于这个情况的探讨和如何处理,请参见注释一节。
    环境块可以包含Unicode或ANSI字符。如果lpEnvironment指向的环境块包含Unicode字符,那么dwCreationFlags字段的CREATE_UNICODE_ENⅥRONMENT标志将被设置。如果块包含ANSI字符,该标志将被清空。
    请注意一个ANSI环境块是由两个零字节结束的:一个是字符串的结尾,另一个用来结束这个快。一个Unicode环境块是由四个零字节结束的:两个代表字符串结束,另两个用来结束块。
    lpCurrentDirectory
    指向一个以NULL结尾的字符串,这个字符串用来指定子进程的工作路径。这个字符串必须是一个包含驱动器名的绝对路径。如果这个参数为空,新进程将使用与调用进程相同的驱动器和目录。这个选项是一个需要启动应用程序并指定它们的驱动器和工作目录的外壳程序的主要条件。
    lpStartupInfo
    指向一个用于决定新进程的主窗体如何显示的STARTUPINFO结构体。
    lpProcessInformation
    指向一个用来接收新进程的识别信息的PROCESS_INFORMATION结构体。

    返回值:

    如果函数执行成功,返回非零值。
    如果函数执行失败,返回零,可以使用GetLastError函数获得错误的附加信息。

  2. 进程的查看、创建和撤销(C语言)

    例程:

#include<stdio.h>
#include<windows.h>
#include<tlhelp32.h>
intshowallproc()
{
PROCESSENTRY32pe32;//用来存储进程信息的结构体
pe32.dwSize=sizeof(pe32);
HANDLEhProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//获取进程快照
if(hProcessSnap==INVALID_HANDLE_VALUE)
{
printf("调用失败 ");
return1;
}
BOOLbProc=Process32First(hProcessSnap,&pe32);
while(bProc)
{
printf("%5d%s ",pe32.th32ProcessID,pe32.szExeFile);//输出进程ID和进程名
bProc=Process32Next(hProcessSnap,&pe32);
}
CloseHandle(hProcessSnap);
return0;
}
intcreatproc()
{
charstr[256]={0};
printf("请输入可执行文件路径(*.exe): ");
scanf("%s",str);
STARTUPINFOsi={0};
si.cb=sizeof(STARTUPINFO);
si.dwFlags=STARTF_USESHOWWINDOW;
si.wShowWindow=SW_SHOW;
PROCESS_INFORMATIONpi;
if(!CreateProcess(NULL,str,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))
{
printf("创建失败 ");
return-1;
}
else
{
printf("创建成功 ");
printf("进程号:%d ",pi.dwProcessId);
}
return0;
}
intstopproc()
{
DWORDProcessID;
printf("请输入想要终止的进程ID ");
scanf("%d",&ProcessID);
HANDLEhProcess=OpenProcess(PROCESS_TERMINATE,FALSE,ProcessID);//打开对应进程句柄
if(hProcess==NULL)
{
printf("失败 ");
return-1;
}
if(!TerminateProcess(hProcess,0))//关闭进程
{
printf("关闭失败 ");
}
else
{
printf("关闭成功 ");
}
CloseHandle(hProcess);

return0;
}
intmain()
{
intn=0;
while(n!=4)
{
printf("1查看进程 ");
printf("2创建进程 ");
printf("3终止进程 ");
printf("4结束 ");
printf("请选择:");
scanf("%d",&n);
switch(n)
{
case1:
showallproc();
break;
case2:
creatproc();
break;
case3:
stopproc();
break;
case4:
break;
default:
printf("输入有误! ");
break;
}
}
return0;
}

⑩ 求无向连通图的生成树(用c语言设计程序)

不知道你要的是不是这个 完整实现如下: #define INFINITY 65535typedef int status;# include <stdio.h># include <stdlib.h># include <conio.h># include "string.h"# define maxlen 10typedef struct{ char vexs[maxlen][maxlen];/*顶点信息集合,我们用它来存入顶点名字*/ int vexnum,arcnum;/*顶点数和边数*/ int arcs[maxlen][maxlen];/*邻接矩阵*/}graph;//定位输入节点的名称int LocateVex(graph G,char u[maxlen]){int i;for(i=0;i<G.vexnum;++i) if(strcmp(u,G.vexs[i])==0) return i; return -1;} void prim(graph &g)/*最小生成树*/{ int i,j,k,min,w,flag; int lowcost[maxlen];/*权值*/ int closet[maxlen];/*最小生成树结点*/ char va[maxlen],vb[maxlen]; //初始化邻接矩阵 //printf("请输入顶点数和边数:\n"); //scanf("%d%d",&g.vexnum,&g.arcnum); g.vexnum=6; g.arcnum=10; printf("请输入顶点信息(我们这里指名字):\n"); for(int j=0;j<g.vexnum;j++) scanf("%s",g.vexs[j]); for(i=0;i<g.vexnum;++i) for(j=0;j<g.vexnum;++j)//初始化邻接矩阵 { g.arcs[i][j]=INFINITY; //任意两个顶点间距离为无穷大。 }//for /*printf("请输入%d条弧的弧尾 弧头 权值(以空格为间隔)\n",g.arcnum); for(k=0;k<g.arcnum;++k) { scanf("%s%s%d%*c",va,vb,&w);//用%*c吃掉回车符 i=LocateVex(g,va); //注意,这里定义的是char va[5],也就是说va是首地址 j=LocateVex(g,vb); g.arcs[i][j]=w; //无向网 g.arcs[j][i]=w; //无向网 }//for */ g.arcs[0][1]=6; g.arcs[1][0]=6; g.arcs[0][2]=1; g.arcs[2][0]=1; g.arcs[0][3]=5; g.arcs[3][0]=5; g.arcs[1][2]=5; g.arcs[2][1]=5; g.arcs[1][4]=3; g.arcs[4][1]=3; g.arcs[2][3]=5; g.arcs[3][2]=5; g.arcs[2][4]=6; g.arcs[4][2]=6; g.arcs[2][5]=4; g.arcs[5][2]=4; g.arcs[3][5]=2; g.arcs[5][3]=2; g.arcs[4][5]=6; g.arcs[5][4]=6; printf("最小生成树的边为:\n"); for(i=1;i<g.vexnum;i++) { lowcost[i]=g.arcs[0][i]; closet[i]=1; } closet[0]=0; //初始v1是属于集合U的,即设它是最小生成树中节点的一员 j=1; //V是顶点集合 for(i=1;i<g.vexnum;i++) { min=lowcost[j]; k=i; for(j=1;j<g.vexnum;j++) if(lowcost[j]<min&&closet[j]!=0) { min=lowcost[j]; k=j; //记录当前要加入集合U的节点号 }//if if(i==1) flag=0; else flag=closet[k]; //还没有加入集合U的节点的closet[]值是 //记录了上一次加入集合U的节点号 closet[k]=0; //将刚刚找到的点加入到集合U中 printf("(%s,%s),",g.vexs[k],g.vexs[flag]);//输出刚刚找到的最小生成树树枝 for(j=1;j<g.vexnum;j++) if(g.arcs[k][j]<lowcost[j]&&closet[j]!=0) { lowcost[j]=g.arcs[k][j]; //更新lowcost[]的值,且在还没有加入U集合的 //的closet[]中记录刚刚加入U集合的节点号以备 //下一循环中输出用 closet[j]=k; } }} int main(){graph g;prim(g);}