1个回答

``````#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 30
typedef struct Gnode *Lgraph;   //输入的n个结点必须
typedef struct Enode *Edge;
typedef struct Queue *que;
typedef struct Vnode
{
struct Queue
{
};
struct Gnode
{
int nv;
int ne;
};
{
int weight;
};
struct Enode
{
int v,w;
int weight;
};
int visit[MAX];

Lgraph CreateLgraph(int n);     //初始化有n个结点的图
void Insert(Lgraph G, Edge E);   //把边插入
Lgraph BuildLgraph();           //完整的创建一个图
void DFS(Lgraph v,int i); //深度遍历图
void RESET(int nv); //重置visit的值
que Createqueue();  //创建有头结点的队列
int Delete(que q);
void Inserts(que q, int x);
void BFS(Lgraph v, int i, que q);  //广度遍历
int Isempty(que q);

int main(void)
{
Lgraph v;
que q;
v = BuildLgraph();
w = v->G[0].firstedge;
if(w->next!=NULL)
printf("BFS\n");
q = Createqueue();
BFS(v,0,q);
printf("DFS\n");
DFS(v,0);
putchar('\n');
RESET(v->nv);
if(v->G[0].firstedge->next == NULL)
printf("over\n");
printf("run over\n");
return 0;
}

Lgraph CreateLgraph(int n)     //初始化有n个结点的图
{
Lgraph g = (Lgraph)malloc(sizeof(struct Gnode));
int i;
g->nv = n;
g->ne = 0;
for(i = 0; i < n; i++)
g->G[i].firstedge = NULL;
return g;
}

void Insert(Lgraph G, Edge E)   //把边插入
{
aj->weight = E->weight;
aj->next = G->G[E->v].firstedge;
G->G[E->v].firstedge = aj;
aj->weight = E->weight;
aj->next = G->G[E->w].firstedge;
G->G[E->w].firstedge = aj;
*/
}

Lgraph BuildLgraph()           //完整的创建一个图
{
Lgraph g;
int n, i;
Edge e;
e = (Edge)malloc(sizeof(struct Enode));
scanf("%d",&n);
g = CreateLgraph(n);
scanf("%d",&g->ne);
for(i = 0; i < g->ne; i++)
{
scanf("%d %d %d",&e->v,&e->w,&e->weight);
Insert(g,e);
}
return g;
}

void DFS(Lgraph v,int i) //深度遍历图
{
if(visit[i] == 0)
{
visit[i] = 1;
printf("%d  ",i);
}
for( ; w; w = w->next)
{
{
printf("\n%d  ",i);
*/
}
}

}

void RESET(int nv) //重置visit的值
{
int i;
for(i = 0; i < nv; i++)
visit[i] = 0;
}

que Createqueue()  //创建有头结点的队列
{
que q = (que)malloc(sizeof(struct Queue));
q->front->next = NULL;
q->rear = q->front;
return q;
}

int Delete(que q)
{
int y;
if(q->front->next == q->rear)
{
temp = q->front->next;
free(temp);
q->front->next = NULL;
q->rear = q->front;
return y;
}
temp = q->front->next;
q->front->next = temp->next;  //这里出错了next没加
free(temp);
return y;

}

void Inserts(que q, int x)
{
temp->next = NULL;
q->rear->next = temp;
q->rear = temp;
}

int Isempty(que q)
{
if(q->front == q->rear)
return 1;
else
return 0;
}

void BFS(Lgraph v, int i, que q)  //广度遍历
{
int t;
visit[i] = 1;
Inserts(q, i);
while(!Isempty(q))
{
t = Delete(q);
printf("%d ",t);
w = v->G[t].firstedge;
if(w->next == NULL)
printf("over\n");
for(; w; w = w->next)
{
if(w == NULL)
printf("null\n");
{
}
}
}
putchar('\n');
}
/*

0 1 5
1 2 5
0 3 5
*/

``````

C语言二叉树非递归遍历问题
#include"stdio.h" #include"stdlib.h" #define OK 1 #define ERROR 0 #define OVERFLOW -1 typedef char TElemType; typedef struct BiTNode{ TElemType data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; typedef int Status; typedef struct LNode{ BiTree data; struct LNode *next; }LNode; typedef struct{ LNode *top; }LStack; int main(){ Status CreateBiTree(BiTree &T); Status Pop(LStack &S); Status Init_Stack(LStack &S); Status Push(LStack &S,BiTree T); Status StackEmpty(LStack S); Status PreOrderTraverse(BiTree T); void visit(TElemType data); BiTree T; printf("创建树中..."); if(CreateBiTree(T)) printf("创建成功\n"); PreOrderTraverse(T); return 0; } Status CreateBiTree(BiTree &T){ TElemType ch; scanf("%c",&ch); if(ch==' ') T=NULL; else{ T=(BiTNode *)malloc(sizeof(BiTNode)); if(!T) exit(OVERFLOW); T->data = ch; CreateBiTree(T->lchild); CreateBiTree(T->rchild); } return OK; } Status Init_Stack(LStack &S){ LNode *p; p=(LNode *)malloc(sizeof(LNode)); if(!p) exit(OVERFLOW); p->next=NULL; S.top=p; return OK; } Status Push(LStack &S,BiTree T){ LNode *p; p=(LNode *)malloc(sizeof(LNode)); if(!p) exit(OVERFLOW); S.top->data = T; p->next = S.top; S.top = p; return OK; } Status StackEmpty(LStack S){ if(S.top==NULL) return 1; else return 0; } void visit(TElemType data){ printf("%c\n",data); } BiTree Pop(LStack &S){ BiTree tran; LNode *t; tran=S.top->data; t=S.top; S.top=S.top->next; free(t); return tran; } Status PreOrderTraverse(BiTree T){ LStack S; Init_Stack(S); BiTree p; p=T; while(p||!(StackEmpty(S))){ if(p){ Push(S,p); p=p->lchild; } else{ p=Pop(S); visit(p->data); p=p->rchild; } } return OK; } //源代码如上，程序运行，我输入ABC DE G F 建立二叉树那一段可以运行，到了二叉树遍历的时候程序无法运行自动关闭，麻烦各位了！

C++图的深度优先遍历非递归哪里错了？

void show_LRD(tree *LRD) { //后序非递归遍历二叉树 int otherstack[max];//辅助栈，用于检测出栈时是否已经遍历右子树 int *othertop,*otherbottom; tree temp; othertop=otherbottom=otherstack; while(LRD||!emptystack()) { while(LRD) { while(LRD) { inputstack(LRD); *othertop++=0; LRD=LRD->lchild; } LRD=gettopstack(); LRD=LRD->rchild; *(othertop-1)=1; } while(*(othertop-1)==1) { popstack(&temp); printf("%c",temp.date); othertop--; } *(othertop-1)=1; LRD=gettopstack(); LRD=LRD->rchild; } } 这是我写的后序非递归遍历二叉树。我用这个与后序递归遍历二叉树一起输出，结果是一样的，可是输出后程序立马就崩溃了。到底问题出在哪，实在想不明。

// 实验三.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> using namespace std; #define true 1 #define false 0 #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define MAXSIZE 100 typedef char TElemType; typedef int Status; typedef struct BiTNode {//二叉树的存储结构 TElemType data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; typedef BiTree SElemType; typedef struct { SElemType *base; //栈底指针 SElemType *top; //栈顶指针 int stacksize; //栈可用的最大容量 }SqStack; Status InitStack(SqStack &S) {//构造一个空栈S S.base=new SElemType[MAXSIZE]; if(!S.base ) exit(OVERFLOW); S.top =S.base ; S.stacksize=MAXSIZE; return OK; } Status Push(SqStack &S,SElemType e) {// if (S.top-S.base==S.stacksize ) return ERROR; *S.top++=e; return OK; } Status Pop(SqStack &S,SElemType e) {// if(S.top==S.base) return ERROR; e=*--S.top; return OK; } SElemType GetTop(SqStack S) {// if(S.top!=S.base ) return *(S.top-1); } Status StackEmpty(SqStack S) { if(S.top==S.base) return OK; else ERROR; } void CreatBiTree(BiTree &T) {//先序遍历的顺序建立二叉链表 char ch; cin>>ch; if(ch=='#') T=NULL; else { T=new BiTNode; T->data=ch; CreatBiTree(T->lchild); CreatBiTree(T->rchild); } } void PreOrderTraverse(BiTree T) {//前序遍历递归算法 if(T) { cout<<T->data; PreOrderTraverse(T->lchild); PreOrderTraverse(T->rchild); } } Status InOrderTraverse(BiTree T) {//中序遍历递归算法 if(T) { InOrderTraverse(T->lchild); cout<<T->data; InOrderTraverse(T->rchild); } return OK; } void InOrderTraverse_non(BiTree &T) {//中序遍历非递归算法 SqStack S; InitStack(S); BiTree p,q; p=T; q=new BiTNode; while (p||!StackEmpty(S)) { if(p) { Push(S,p); p=p->lchild; } else { Pop(S,q); cout<<q->data; p=q->rchild; } } } void PostOrderTraverse(BiTree T) {//后序遍历递归算法 if(T) { PostOrderTraverse(T->lchild); PostOrderTraverse(T->rchild); cout<<T->data; } } int Depth(BiTree T) {//计算二叉树的深度 int m,n; if(T==NULL) return 0; else { m=Depth(T->lchild ); n=Depth(T->rchild ); if(m>n) return (m+1); else return (n+1); } } int NodeCount(BiTree T) {//统计二叉树中的结点个数 if(T==NULL) return 0; else return NodeCount(T->lchild)+NodeCount(T->rchild)+1; } Status LeafCount(BiTree &T,int m) {//统计二叉树的叶结点个数 if(T) { if(!T->lchild&&!T->rchild) m++; else m=LeafCount(T->lchild,m)+LeafCount(T->rchild,m); } return m; } Status CountTNode_1(BiTree &T,int m) {//统计二叉树中度为1的结点个数 if(T) { if(!T->lchild&&T->rchild) m++ ; if(!T->rchild&&T->lchild) m++; else m=CountTNode_1(T->lchild,m)+CountTNode_1(T->rchild,m); } return m; } Status Exchangechild(BiTree&T) {//交换二叉树每个结点的左孩子和右孩子 BiTree t; if(T) { t=T->lchild; T->lchild=T->rchild; T->rchild=t; Exchangechild(T->lchild); Exchangechild(T->rchild); } return OK; } //void Allpath(BiTree &T,LinkStack &S) //{ //char e; //if(T) // { // Push(S,T->data); // if(!T->lchild &&!T->rchild ) printStack(S); //else //{ // Allpath(T->lchild ,S); // Allpath(T->rchild ,S); // } // Pop(S,e); //} //} int main() { int choose,d,n_leaf,n_1,n_node; int m,m_1; m=m_1=0; BiTree T; cout<<"1.先序遍历递归建立二叉链表"<<endl; cout<<"2.前序遍历递归算法输出元素"<<endl; cout<<"3.中序遍历递归算法输出元素."<<endl; cout<<"4.中序遍历非递归算法输出元素"<<endl; cout<<"5.后序遍历递归算法输出元素"<<endl; cout<<"6.计算二叉树的深度"<<endl; cout<<"7.统计二叉树中的结点个数"<<endl; cout<<"8.统计二叉树中的叶子结点个数"<<endl; cout<<"9.统计二叉树中度为一的结点个数"<<endl; cout<<"10.交换二叉树的左孩子和右孩子"<<endl; cout<<"0.退出"<<endl; choose=-1; while(choose!=0) { cout<<"请选择："; cin>>choose; switch(choose) {case 1: cout<<"建立二叉树，请输入元素"<<endl; CreatBiTree(T); break; case 2: cout<<"元素按照前序输出为"<<endl; PreOrderTraverse( T); cout<<endl; break; case 3: cout<<"元素按照中序递归输出为"<<endl; InOrderTraverse(T); break; case 4: cout<<"元素按照中序非递归输出为"<<endl; InOrderTraverse_non(T); cout<<endl; break; case 5: cout<<"元素按照后序递归输出为"<<endl; PostOrderTraverse(T); cout<<endl; break; case 6: cout<<"二叉树的深度为"<<endl; d=Depth( T); cout<<d<<endl; break; case 7: cout<<"二叉树中的结点个数为："<<endl; n_node=NodeCount( T); cout<<n_node<<endl; break; case 8: cout<<"二叉树中的叶子结点个数为："<<endl; n_leaf=LeafCount(T,m); cout<<n_leaf; break; case 9: cout<<"二叉树中度为一的结点个数为："<<endl; n_1=CountTNode_1(T,m_1); cout<<n_1<<endl; break; case 10: if(Exchangechild(T)) cout<<"左孩子右孩子交换成功"<<endl; else cout<<"左孩子右孩子交换失败"<<endl; break; } } return 0; } 这段代码中的中序遍历非递归算法无法实现，，为什么啊，，求大神解答

C语言用递归求圆周率的值，怎么实现
C语言用递归求圆周率的值，要求精确到小数点后3位，不得使用循环

C语言递归的内存释放问题

（接上文《源码阅读(18)：Java中主要的Map结构——HashMap容器（中）》） 3.4.4、HashMap添加K-V键值对（红黑树方式） 上文我们介绍了在HashMap中table数组的某个索引位上，基于单向链表添加新的K-V键值对对象（HashMap.Node&lt;K, V&gt;类的实例），但是我们同时知道在某些的场景下，HashMap中table数据的某个索引位上，数据是按照红黑树
c++制作的植物大战僵尸，开源，一代二代结合游戏
此游戏全部由本人自己制作完成。游戏大部分的素材来源于原版游戏素材，少部分搜集于网络，以及自己制作。 此游戏为同人游戏而且仅供学习交流使用，任何人未经授权，不得对本游戏进行更改、盗用等，否则后果自负。 目前有六种僵尸和六种植物，植物和僵尸的动画都是本人做的。qq：2117610943 开源代码下载 提取码：3vzm 点击下载--&gt; 11月28日 新增四种植物 统一植物画风，全部修
Java学习的正确打开方式

Python——画一棵漂亮的樱花树（不同种樱花+玫瑰+圣诞树喔）

linux系列之常用运维命令整理笔录

Python 基础（一）：入门必备知识

Python十大装B语法
Python 是一种代表简单思想的语言，其语法相对简单，很容易上手。不过，如果就此小视 Python 语法的精妙和深邃，那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点，并附上详细的实例代码。如能在实战中融会贯通、灵活使用，必将使代码更为精炼、高效，同时也会极大提升代码B格，使之看上去更老练，读起来更优雅。 1. for - else 什么？不是 if 和 else 才

2019年11月中国大陆编程语言排行榜
2019年11月2日，我统计了某招聘网站，获得有效程序员招聘数据9万条。针对招聘信息，提取编程语言关键字，并统计如下： 编程语言比例 rank pl_ percentage 1 java 33.62% 2 c/c++ 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7

Python 编程实用技巧
Python是一门很灵活的语言，也有很多实用的方法，有时候实现一个功能可以用多种方法实现，我这里总结了一些常用的方法，并会持续更新。
“狗屁不通文章生成器”登顶GitHub热榜，分分钟写出万字形式主义大作

"狗屁不通文章生成器"登顶GitHub热榜，分分钟写出万字形式主义大作
GitHub 被誉为全球最大的同性交友网站，……，陪伴我们已经走过 10+ 年时间，它托管了大量的软件代码，同时也承载了程序员无尽的欢乐。 万字申请，废话报告，魔幻形式主义大作怎么写？兄dei，狗屁不通文章生成器了解一下。这个富有灵魂的项目名吸引了众人的目光。项目仅仅诞生一周，便冲上了GitHub趋势榜榜首（Js中文网 -前端进阶资源教程）、是榜首哦