user-0 提问: 有木有大神帮帮忙调一下这个程序呀，好急的呀

回复:
user: user-1
content: 我也是这个实验

user: user-1
content: 你现在还有这个实验吗

user: user-2
content: 再供参考： 递归转非递归指南：http://www.codeproject.com/Articles/418776/How-to-replace-recursive-functions-using-stack-and

user: user-2
content: 不要依赖调试器输出复杂数据结构！而要将复杂数据结构的整个内容在处理它的每一步使用一小段代码按自己很容易理解的格式输出，非常有助于调试！或者可以说是“基础设施” 参考下面：//不带表头结点的单向链表 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <time.h> #include <locale.h> struct NODE {     int          data;     struct NODE *next; } *head,*p,*q,*s,*p1,*p2,*q1,**ta; int i,k,n,t,m,v,N=10; int main() {     setlocale(LC_ALL,"chs");     srand(time(NULL));      head=NULL;      printf("创建%d个节点的单链表:",N);//创建N个节点的单链表     p=head;     for (i=0;i<N;i++) {         q=(struct NODE *)malloc(sizeof(struct NODE));         if (NULL==q) exit(1);         q->data=rand()%100;//填写0..99的随机值         q->next=NULL;         if (NULL==p) {             head=q;             p=head;         } else {             p->next=q;             p=q;         }     }      //输出整个单链表     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      k=3;     v=5;     printf("将值为%d的结点插入到单链表的第%d个结点前:",v,k);//将值为v的结点插入到单链表的第k个结点前     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==1) {             q=(struct NODE *)malloc(sizeof(struct NODE));             if (NULL==q) exit(1);             q->data=v;             q->next=head;             head=q;             break;         } else {             if (k-1==n) {                 q=(struct NODE *)malloc(sizeof(struct NODE));                 if (NULL==q) exit(1);                 q->data=v;                 q->next=p->next;                 p->next=q;                 break;             }         }         p=p->next;     }      //输出整个单链表     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      k=5;     printf("删除第%d个节点:",k);//删除第k个节点     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==1) {             q=head;             head=head->next;             free(q);             break;         } else {             if (k-1==n) {                 q=p->next;                 if (q) {                     p->next=q->next;                     free(q);                 }                 break;             }         }         p=p->next;     }      //输出整个单链表     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      printf("从小到大排序:");//从小到大排序     for (p=head,p1=NULL;p!=NULL;p1=p,p=p->next) {         for (q=p->next,q1=p;q!=NULL;q1=q,q=q->next) {             if (p->data > q->data) {                  //交换data //              printf("swap %02d %02d\n",p->data,q->data); //              t=p->data;p->data=q->data;q->data=t;                  //或者                  //交换next //              printf("swap %02d %02d\n",p->data,q->data);                 if (p==head) {//p是头                     if (p->next==q) {//pq挨着                         head=q;                         p->next=q->next;                         q->next=p;                         q=p;                         p=head;                     } else {//pq不挨着                         head=q;                         p2=p->next;                         p->next=q->next;                         q->next=p2;                         q1->next=p;                         q=p;                         p=head;                     }                 } else {//p不是头                     if (p->next==q) {//pq挨着                         p1->next=q;                         p->next=q->next;                         q->next=p;                         q=p;                         p=p1->next;                     } else {//pq不挨着                         p1->next=q;                         p2=p->next;                         p->next=q->next;                         q->next=p2;                         q1->next=p;                         q=p;                         p=p1->next;                     }                 }                  //输出整个单链表 //              s=head; //              while (1) { //                  if (NULL==s) { //                      printf("\n"); //                      break; //                  } //                  printf("%02d->",s->data); //                  s=s->next; //              } //              getchar();             }         }     }      //输出整个单链表并计算链表长度n     n=0;     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         n++;         s=s->next;     }      printf("将整个链表逆序:");//将整个链表逆序     if (n>=2) {         p=head;         q=p->next;         p->next=NULL;         while (1) {             q1=q->next;             q->next=p;             p=q;             q=q1;             if (NULL==q) break;         }         head=p;     }      //输出整个单链表     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      m=4;     n=6;     printf("将单链表中前%d个结点和后%d个结点进行互换:",m,n);//将单链表中前m个结点和后n个结点进行互换,m+n为链表总长     k=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         k++;         if (m==k) {             q=p;         }         s=p;         p=p->next;     }     q1=head;     head=q->next;     s->next=q1;     q->next=NULL;      //输出整个单链表     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //释放所有节点     p=head;     while (1) {         if (NULL==p) {             break;         }         q=p->next;         free(p);         p=q;     }      return 0; } //创建10个节点的单链表:08->74->07->23->03->99->31->56->88->16-> //将值为5的结点插入到单链表的第3个结点前:08->74->05->07->23->03->99->31->56->88->16-> //删除第5个节点:08->74->05->07->03->99->31->56->88->16-> //从小到大排序:03->05->07->08->16->31->56->74->88->99-> //将整个链表逆序:99->88->74->56->31->16->08->07->05->03-> //将单链表中前4个结点和后6个结点进行互换:31->16->08->07->05->03->99->88->74->56-> //

user: user-3
content: 出错时点中断，通过调用堆栈、变量窗口等观察分析原因  学会调试才是楼主需要的

user: user-0
content: 而且程序没有崩溃，经验不足所以就不知道应该怎么做了

user: user-0
content: 现在我调试知道问题在哪了,就是创建图和存储图的子函数应该引用结构体指针，对结构体进行操作，而不是复制它的值，但是我不知道应该怎么引用它的指针，就是怎么改？

user: user-4
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-0
content: 题目在这： 先任意创建一个图 图的DFS,BFS的递归和非递归算法的实现 最小生成树（两种算法）的实现，求连通分量的实现 选择用邻接矩阵、邻接表等结构存储实现

user: user-0
content: 这是主函数，题目在图片那 int main() { 	//MGraph_L G; 	//ALGraph gra; 	int s,j; 	char y='y';     printf("||¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤菜单¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤||\n");     printf("||-------------------------【0、创建一个无向图------------------------------||\n");     printf("||-------------------------【1、显示该图的邻接矩阵--------------------------||\n");     printf("||-------------------------【2、显示该图的邻接表----------------------------||\n"); 	printf("||-------------------------【3、广度优先遍历--------------------------------||\n");     printf("||-------------------------【4、深度优先遍历--------------------------------||\n"); 	printf("||-------------------------【5、连通分量------------------------------------||\n");     printf("||-------------------------【6、最小生成树MiniSpanTree_PRIM算法-------------||\n");     printf("||-------------------------【7、最小生成树MiniSpanTree_KRUSCAL算法----------||\n"); 	printf("||¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤||\n"); 	//printf("\t\t\t在求最小生成树前请先求连通分量!\n"); 	while(y=='y') 	{ 		printf("\t请选择菜单：\n"); 		printf("\t");         scanf("%d",&s); 		if(s==0) 		{ 			++o; 			if(o==2) 			{ 				n=0; 				l=0; 				o=0; 			} 		} 		switch(s) 		{ 		case 0:printf("\t创建一个无向图：\n"); 			creatMGraph_L(G);//用邻接矩阵的方式创建 			creatadj(gra,G);//但是为了输出方便使用邻接表的方式存储             break; 		case 1:printf("\t邻接矩阵显示如下：\n"); 			ljjzprint(G);             break;         case 2:             printf("\t邻接表显示如下：\n");             adjprint(gra,G);             break;         case 3:             printf("\t广度优先遍历：");             BFSTraverse(gra);             printf("\n");             break;         case 4: 			printf("\t深度优先遍历：");             DFStra(gra);             printf("\n");             break; 		case 5:printf("\t连通分量:\n"); 			DFSTraverse_fen(gra);             break;         case 6: 			if(n==0)  {printf("\t无权图没有最小生成树"); break;} 			else  				if(l>1) {printf("\t若该图为非强连通图(含有多个连通分量)时，最小生成树不存在\n"); break;} 			else 			{ 				int i,g[maxv][maxv]; 				for(i=0;i!=G.vexnum;++i) 					for(j=0;j!=G.vexnum;++j) 						g[i+1][j+1]=G.arcs[i][j].adj; 					printf("\t普利姆算法:\n"); 					MiniSpanTree_PRIM(g,G.vexnum); 					break; 			}         case 7:if(n==0){printf("\t无权图没有最小生成树");break;} 			else if(l>1){printf("\t该图为非强连通图(含有多个连通分量)，最小生成树不存在\n");break;} 			else 			{ 				printf("\t克鲁斯卡尔算法:\n");                 MiniSpanTREE_KRUSCAL(G,gra);                 break; 			}          		} 		printf("\n\t是否继续？y or n:\n"); 		printf("\t"); 		fflush(stdin);//刷新缓冲区，防止影响下次输入         scanf("%c",&y);         if(y=='n')         break; 	} 	return 0; }

user: user-0
content: 这是主函数，题目在图片那 int main() { 	//MGraph_L G; 	//ALGraph gra; 	int s,j; 	char y='y';     printf("||¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤菜单¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤||\n");     printf("||-------------------------【0、创建一个无向图------------------------------||\n");     printf("||-------------------------【1、显示该图的邻接矩阵--------------------------||\n");     printf("||-------------------------【2、显示该图的邻接表----------------------------||\n"); 	printf("||-------------------------【3、广度优先遍历--------------------------------||\n");     printf("||-------------------------【4、深度优先遍历--------------------------------||\n"); 	printf("||-------------------------【5、连通分量------------------------------------||\n");     printf("||-------------------------【6、最小生成树MiniSpanTree_PRIM算法-------------||\n");     printf("||-------------------------【7、最小生成树MiniSpanTree_KRUSCAL算法----------||\n"); 	printf("||¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤||\n"); 	//printf("\t\t\t在求最小生成树前请先求连通分量!\n"); 	while(y=='y') 	{ 		printf("\t请选择菜单：\n"); 		printf("\t");         scanf("%d",&s); 		if(s==0) 		{ 			++o; 			if(o==2) 			{ 				n=0; 				l=0; 				o=0; 			} 		} 		switch(s) 		{ 		case 0:printf("\t创建一个无向图：\n"); 			creatMGraph_L(G);//用邻接矩阵的方式创建 			creatadj(gra,G);//但是为了输出方便使用邻接表的方式存储             break; 		case 1:printf("\t邻接矩阵显示如下：\n"); 			ljjzprint(G);             break;         case 2:             printf("\t邻接表显示如下：\n");             adjprint(gra,G);             break;         case 3:             printf("\t广度优先遍历：");             BFSTraverse(gra);             printf("\n");             break;         case 4: 			printf("\t深度优先遍历：");             DFStra(gra);             printf("\n");             break; 		case 5:printf("\t连通分量:\n"); 			DFSTraverse_fen(gra);             break;         case 6: 			if(n==0)  {printf("\t无权图没有最小生成树"); break;} 			else  				if(l>1) {printf("\t若该图为非强连通图(含有多个连通分量)时，最小生成树不存在\n"); break;} 			else 			{ 				int i,g[maxv][maxv]; 				for(i=0;i!=G.vexnum;++i) 					for(j=0;j!=G.vexnum;++j) 						g[i+1][j+1]=G.arcs[i][j].adj; 					printf("\t普利姆算法:\n"); 					MiniSpanTree_PRIM(g,G.vexnum); 					break; 			}         case 7:if(n==0){printf("\t无权图没有最小生成树");break;} 			else if(l>1){printf("\t该图为非强连通图(含有多个连通分量)，最小生成树不存在\n");break;} 			else 			{ 				printf("\t克鲁斯卡尔算法:\n");                 MiniSpanTREE_KRUSCAL(G,gra);                 break; 			}  		} 		printf("\n\t是否继续？y or n:\n"); 		printf("\t"); 		fflush(stdin);//刷新缓冲区，防止影响下次输入         scanf("%c",&y);         if(y=='n')         break; 	} 	return 0; }