user-0 提问: 我的代码有点问题，有哪位大神帮我解答一下，感激不尽！有点急

回复:
user: user-1
content: 图片表示：

user: user-1
content: 测试环境：vs2013 win64 文件类型.cpp(我改为了C++类型文件，C语言没有引用)  问题： 1.函数调用出现问题 QueueTraverse 函数的第二个参数，未提供函数指针，我已添加，参见下图和源码（即缺少变量） 2.局部变量的问题 QueueLength函数的返回值即为长度，但该函数中的i和main函数中的i不是同一变量，故需要再定义相关int变量接收返回结果再打印其数值。  修改后的源码如下： #define _CRT_SECURE_NO_WARNINGS #include <cstdio> #include <cstdlib> #include <iostream> #define TRUE 1 #define FALSE 0 #define  OK 1 #define  ERROR 0 #define  INFEASIBLE -1 #define  WVERFLOW -2  typedef int Qelemtype; typedef int Status;  typedef struct Qnode { 	Qelemtype data; 	struct Qnode *next; }Qnode, *Queueptr;  typedef struct { 	Queueptr front; 	Queueptr rear; }Linkqueue;  Status Initqueue(Linkqueue &Q);//构造一个空队列 Status Destroyqueue(Linkqueue &Q);//销毁队列 Status Enqueue(Linkqueue &Q, Qelemtype e);//插入新元素 Status Dequeue(Linkqueue &Q, Qelemtype &e); //删除队头元素 Status getfirst(Linkqueue &Q);//输出队头元素 Status QueueTraverse(Linkqueue Q, void(*vi)(Qelemtype));//遍历整个队列 Status QueueLength(Linkqueue Q);//返回队列的长度   void QueuePrintf(int data);//打印节点值  void QueuePrintf(int data) { 	printf("%d ", data);  } Status Initqueue(Linkqueue &Q) { 	Q.front = Q.rear = (Queueptr)malloc(sizeof(Qnode)); 	if (!Q.front)  return (WVERFLOW); 	Q.front->next = NULL; 	return OK; }//构造一个空队列  bool QueueEmpty(Linkqueue &Q) { 	if (Q.front == Q.rear)//队列为空的情况     		return OK; 	else 		return ERROR; }//判断队列是否为空  Status Enqueue(Linkqueue &Q, Qelemtype e) { 	Queueptr p; 	p = (Queueptr)malloc(sizeof(Qnode)); 	if (!p) return(WVERFLOW); 	//scanf("%d",&e); 	p->data = e; 	p->next = NULL; 	Q.rear->next = p; 	Q.rear = p; 	return OK; }//插入新元素  Status Dequeue(Linkqueue &Q, Qelemtype &e) { 	Queueptr p; 	if (Q.front == Q.rear)  return ERROR; 	p = Q.front->next; 	e = p->data; 	Q.front->next = p->next; 	if (Q.rear == p) Q.rear = Q.front; 	free(p); 	return OK; }//删除队头元素  Status getfirst(Linkqueue &Q) { 	if (Q.front == Q.rear) 	{  		return ERROR; 	} 	else 		return Q.front->next->data; }//返回队头元素  Status QueueTraverse(Linkqueue Q, void(*vi)(Qelemtype)) { 	Queueptr p; 	p = Q.front->next; 	while (p) 	{ 		vi(p->data); 		p = p->next; 	} 	printf("\n"); 	return OK; }//遍历整个队列  Status QueueLength(Linkqueue Q) { 	Qnode *p; 	p = Q.front; 	int i = 0;//局部变量和下面的printf中的i不是同一个变量 	while (p != Q.rear) 	{ 		p = p->next; 		i++; 	} 	return i; }//返回队列的长度   Status Destroyqueue(Linkqueue &Q) { 	while (Q.front) 	{ 		Q.rear = Q.front->next; 		free(Q.front); 		Q.front = Q.rear; 	} 	return OK; }//销毁队列  int main() { 	Linkqueue Q; 	Qelemtype e, n, i=0, x; 	char select; 	do 	{ 		printf("                        主菜单                         \n"); 		printf("*******************************************************\n"); 		printf("* 1.构造一个空队列           2.判断队列是否为空       *\n"); 		printf("* 3.向队列中插入元素         4.删除队头元素           *\n"); 		printf("* 5.输出队头元素             6.遍历整个队列           *\n"); 		printf("* 7.返回队列的长度           8.销毁队列               *\n"); 		printf("*******************************************************\n"); 		printf("您的选择是:");  		select = getchar(); 		switch (select) 		{ 		case '1': 			if (Initqueue(Q)) 				printf("构造成功\n"); 			else 				printf("构造失败\n"); 			break; 		case '2': 			if (QueueEmpty(Q)) 				printf("队列为空！\n"); 			else 				printf("队列非空！\n"); 			break; 		case '3': 			scanf("%d", &e); 			if (Enqueue(Q, e)) 				printf("新元素插入成功！插入的元素是%d\n", e); 			else 				printf("元素插入失败！\n"); 			break;  		case '4': 			if (Dequeue(Q, x)) 				printf("删除的队头元素是: %d\n", x); 			else 				printf("删除失败\n"); 			break; 		case '5': 			if (Dequeue(Q, n)) 				printf("队头元素为：%d", n); 			else 				printf("输出队头元素失败！\n"); 			break; 		case '6': 			printf("队列为："); 			QueueTraverse(Q, QueuePrintf); 				//失败的逻辑自己补充 			break; 		case '7': 			if (i=QueueLength(Q))//不会发生错误 				printf("队列的长度为：%d", i); 			break; 		case '8': 			if (Destroyqueue(Q)) 				printf("销毁队列成功\n"); 			else 				printf("销毁失败\n"); 			break;  		default: 			printf("您的输入不服规范，请重新输入!"); 		} 		getchar(); 		printf("\n\n"); 	} while (select != '0');; 	return OK; }

user: user-2
content: select换一个吧

user: user-3
content: #include <stdio.h> #include <stdlib.h> #include <iostream.h> #define TRUE 1 #define FALSE 0 #define  OK 1 #define  ERROR 0 #define  INFEASIBLE -1 #define  OVERFLOW -2  typedef int Qelemtype; typedef int Status;  typedef struct Qnode {     Qelemtype data;     struct Qnode *next; }Qnode, *Queueptr;  typedef struct {     Queueptr front;     Queueptr rear; }Linkqueue;  Status Initqueue(Linkqueue &Q);//构造一个空队列 Status Destroyqueue(Linkqueue &Q);//销毁队列 Status Enqueue(Linkqueue &Q,Qelemtype e);//插入新元素 Status Dequeue(Linkqueue &Q,Qelemtype &e); //删除队头元素 Status getfirst(Linkqueue &Q);//输出队头元素 Status QueueTraverse(Linkqueue Q,void(*vi)(Qelemtype));//遍历整个队列 Status QueueLength(Linkqueue Q);//返回队列的长度  void print_data(Qelemtype data) {     printf("%d ", data); }  Status Initqueue(Linkqueue &Q) {     Q.front = Q.rear = (Queueptr) malloc (sizeof(Qnode));     if(!Q.front)  return (OVERFLOW);     Q.front ->next = NULL;     return OK; }//构造一个空队列  bool QueueEmpty(Linkqueue &Q) {     if(Q.front==Q.rear)//队列为空的情况         return OK;     else         return ERROR; }//判断队列是否为空  Status Enqueue(Linkqueue &Q,Qelemtype e) {     Queueptr p;     p = (Queueptr) malloc (sizeof(Qnode));     if(!p) return(OVERFLOW);     //scanf("%d",&e);     p->data = e;     p->next = NULL;     Q.rear->next = p;     Q.rear = p;     return OK; }//插入新元素  Status Dequeue(Linkqueue &Q,Qelemtype &e) {     Queueptr p;     if(Q.front == Q.rear)  return ERROR;     p = Q.front->next;     e = p->data;     Q.front->next = p->next;     if(Q.rear == p) Q.rear = Q.front;     free(p);     return OK; }//删除队头元素  Status getfirst(Linkqueue &Q) {     if(Q.front==Q.rear)     {          return ERROR;     }     else         return Q.front->next->data; }//返回队头元素  Status QueueTraverse(Linkqueue Q,void(*vi)(Qelemtype)) {     Queueptr p;     p=Q.front->next;     while(p)     {         vi(p->data);         p=p->next;     }     printf("\n");     return OK; }//遍历整个队列  Status QueueLength(Linkqueue Q) {     Qnode *p;     p=Q.front;     int i=0;     while(p!=Q.rear)     {         p=p->next;         i++;     }     return i; }//返回队列的长度   Status Destroyqueue(Linkqueue &Q) {     while(Q.front)     {         Q.rear = Q.front ->next;         free(Q.front);         Q.front = Q.rear;     }     return OK; }//销毁队列  int main() {     Linkqueue Q;     Qelemtype e,n,i,x;     char select;     do     {         printf("                        主菜单                         \n");         printf("*******************************************************\n");         printf("* 1.构造一个空队列           2.判断队列是否为空       *\n");         printf("* 3.向队列中插入元素         4.删除队头元素           *\n");         printf("* 5.输出队头元素             6.遍历整个队列           *\n");         printf("* 7.返回队列的长度           8.销毁队列               *\n");         printf("*******************************************************\n");         printf("您的选择是:");          select=getchar();         switch(select)         {             case '1':                 if(Initqueue(Q))                     printf("构造成功\n");                 else                     printf("构造失败\n");                 break;             case '2':                 if( QueueEmpty(Q))                     printf("队列为空！\n");                 else                     printf("队列非空！\n");                 break;             case '3':                 scanf("%d",&e);                 if(Enqueue(Q,e))                     printf("新元素插入成功！插入的元素是%d\n",e);                 else                     printf("元素插入失败！\n");                 break;              case '4':                 if(Dequeue(Q,x))                     printf("删除的队头元素是: %d\n",x);                 else                     printf("删除失败\n");                 break;             case '5':                 if(Dequeue(Q,n))                     printf("队头元素为：%d",n);                 else                     printf("输出队头元素失败！\n");                 break;             case '6':                 printf("队列为：");                 QueueTraverse(Q, print_data);                 break;             case '7':                 i = QueueLength(Q);                 printf("队列的长度为：%d",i);                 break;             case '8':                 if(Destroyqueue(Q))                     printf("销毁队列成功\n");                 else                     printf("销毁失败\n");                 break;              default:                 printf("您的输入不服规范，请重新输入!");         }         getchar();         printf("\n\n");     }while(select!='0');;     return OK; }  遍历队列和返回队列的长度调用上有问题；详见main函数的处理；另外，新加了一个回调函数，之前你的代码里没有这个函数：print_data; 其他没什么问题，在菜单设计上，个人认为初始化队列和销毁队列不用加到菜单项里，可以考虑程序起来就默认初始化队列，另外，加一个退出选项，调用退出选项先将队列销毁，然后再退出程序，这样做呢可以防止用户在使用时，在销毁队列之后，又向队列中插入数据，这样就会导致段错误了。为了防止这种情况发生，初始化队列和销毁队列做成默认的。