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语言递归的内存释放问题

Java学习的正确打开方式

《奇巧淫技》系列-python！！每天早上八点自动发送天气预报邮件到QQ邮箱

Python 植物大战僵尸代码实现(2):植物卡片选择和种植

YOLO 是我非常喜欢的目标检测算法，堪称工业级的目标检测，能够达到实时的要求，它帮我解决了许多实际问题。 这就是 YOLO 的目标检测效果。它定位了图像中物体的位置，当然，也能预测物体的类别。 之前我有写博文介绍过它，但是每次重新读它的论文，我都有新的收获，为此我准备写一个系列的文章来详尽分析它。这是第一篇，从它的起始 YOLOv1 讲起。 YOLOv1 的论文地址：https://www.c

20行Python代码爬取王者荣耀全英雄皮肤

TCP/IP协议是传输层协议，主要解决数据如何在网络中传输，而HTTP是应用层协议，主要解决如何包装数据。 一、TCP与UDP的不同 1. 是否需要建立连接。 UDP在传送数据之前不需要先建立连接；TCP则提供面向连接的服务； 2. 是否需要给出确认 对方的传输层在收到UDP报文后，不需要给出任何确认，而 TCP需要给出确认报文，要提供可靠的、面向连接的传输服务。 3.虽然UDP不提供可靠交...

2019年互联网寒冬，大批企业开始裁员，下图是网上流传的一张截图： 裁员不可避免，那如何才能做到不管大环境如何变化，自身不受影响呢？ 我们先来看一个有意思的故事，如果西游记取经团队需要裁员一名，会裁掉谁呢，为什么？ 西游记团队组成： 1.唐僧 作为团队teamleader，有很坚韧的品性和极高的原则性，不达目的不罢休，遇到任何问题，都没有退缩过，又很得上司支持和赏识(直接得到唐太宗的任命，既给

Python语言高频重点汇总
Python语言高频重点汇总 GitHub面试宝典仓库——点这里跳转 文章目录Python语言高频重点汇总**GitHub面试宝典仓库——点这里跳转**1. 函数-传参2. 元类3. @staticmethod和@classmethod两个装饰器4. 类属性和实例属性5. Python的自省6. 列表、集合、字典推导式7. Python中单下划线和双下划线8. 格式化字符串中的%和format9.

（经验分享）作为一名普通本科计算机专业学生，我大学四年到底走了多少弯路

Redis 面试题 1、什么是 Redis?. 2、Redis 的数据类型？ 3、使用 Redis 有哪些好处？ 4、Redis 相比 Memcached 有哪些优势？ 5、Memcache 与 Redis 的区别都有哪些？ 6、Redis 是单进程单线程的？ 7、一个字符串类型的值能存储最大容量是多少？ 8、Redis 的持久化机制是什么？各自的优缺点？ 9、Redis 常见性...

【设计模式】单例模式的八种写法分析

《面试宝典》：检验是否为合格的初中级程序员的面试知识点，你都知道了吗？查漏补缺