① 設計一個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);}