[C言語](スタック+二叉樹)表式ツリー実装(テスト事例を含む)

23160 ワード

プログラムの内容はたくさん見られますが、実は慌てないでください.主に三つの部分に分けられます.
  • スタックの基礎コンテンツの実現(スタックの作成)
  • 二叉樹の基礎コンテンツの実現(二叉樹の合併/二叉樹のエルゴード/二叉樹の解放)
  • メインプログラム試験
  • //
    //         !
    #include
    #include
    
    
    typedef char ElementTypeT;
    struct BTreeNode 
    {
    	ElementTypeT element;
    	struct BTreeNode * left;
    	struct BTreeNode *right;
    };
    typedef struct BTreeNode *ptrNode;
    typedef ptrNode BTree;
    ptrNode createNode(ElementTypeT e);
    BTree addTree(BTree bt1,BTree bt2);
    void disposeTree(BTree bt);//   ,      free
    void inorder(BTree bt);
    void postorder(BTree bt);
    void preorder(BTree bt);
    //            ,                
    //     ,    ,        !
    
    
    ptrNode createNode(ElementTypeT e)
    {
    	ptrNode bt = (ptrNode)malloc(sizeof(struct BTreeNode));
    	if(bt==NULL)
    		return NULL;//    
    	bt->element = e;
    	bt->right = NULL;
    	bt->left = NULL;
    	return bt;
    }
    BTree addTree(BTree bt1,BTree bt2)
    {
    	if(bt1==NULL)
    		bt1=bt2;
    	else if(!bt1->right)
    		bt1->right=bt2;
    	else
    		bt1->left = bt2;
    	return bt1;//            ,          !
    }
    void disposeTree(BTree bt)
    {
    	if(bt==NULL)
    		return ;//    
    	disposeTree(bt->left);
    	disposeTree(bt->right);
    	free(bt);
    }
    void inorder(BTree bt)
    {
    	if(bt==NULL)
    		return ;
    	inorder(bt->left);
    	printf("%c ",bt->element);
    	inorder(bt->right);
    }
    
    //        !
    typedef BTree ElementType;
    typedef struct Node* PtrToNode;
    typedef PtrToNode Stack;
    struct Node{
    	ElementType data;
    	PtrToNode next;
    };
    Stack createStack();//    
    void makeEmpty(Stack);
    void dispose(Stack);
    void push(ElementType,Stack);//  
    ElementType pop(Stack);//  
    
    
    //    
    Stack createStack()
    {
    	Stack s;
    	s = (Stack)malloc(sizeof(struct Node));
    	if(s==NULL)
    		return NULL;//    
    	s->next = NULL;
    	makeEmpty(s);
    	return s;
    }
    void makeEmpty(Stack s)
    {
    	if(s==NULL)
    		return ;//    
    	while((s->next)!=NULL)
    		pop(s);//         
    }
    void dispose(Stack s)
    {
    	if(s==NULL)
    		return ;//    
    	makeEmpty(s);
    	free(s);
    }
    void push(ElementType e,Stack s)
    {
    	Stack node = (Stack)malloc(sizeof(struct Node));
    	if(node ==NULL)
    		return ;//    
    	node->data = e;
    	node->next = s->next;
    	s->next = node;
    }
    ElementType pop(Stack s)
    {
    	if(s->next!=NULL)
    	{
    		Stack node = s->next;
    		ElementType e = node->data;
    		s->next = node->next;
    		free(node);
    		return e;
    		
    	}
    	return NULL;
    }
    int main()
    {
    	char postfix[30]="ab+cde+**";
    	
    	Stack s = createStack();
    	BTree a,b,bt,letter;
    	int i = 0;
    	while(postfix[i]!='\0')
    	{
    		char c = postfix[i];
    		switch(c)
    		{
    			case'+':
    			case'-':
    			case'*':
    			case'/':
    				a = pop(s);
    				b = pop(s);
    				bt = createNode(c);
    				bt = addTree(bt,a);
    				bt = addTree(bt,b);
    				push(bt,s);
    				break;
    			default:
    				letter = createNode(c);
    				push(letter,s);
    		}
    
    		i++;	
    	}
    		BTree expre_tree = pop(s);
    		printf("zhong xu:
    "
    ); inorder(expre_tree); disposeTree(expre_tree);// , ! dispose(s); return 0; printf("
    "
    ); }
    コードの参考源はこの大男のです.