user-0 提问: 一个奇怪的程序   

回复:
user: user-1
content: void main() {     int a;     create_flat();     while(1)     {         printf("\n");         printf("/********************************************************\\\n");         printf("*                                                    *\n");         printf("*                城市小区管理信息系统                *\n");         printf("*                      主菜单                        *\n");         printf("*                                                    *\n");         printf("*                    1.录入(增加)信息                *\n");         printf("*                    2.删除信息                      *\n");         printf("*                    3.输出信息                      *\n");         printf("*                    4.查找信息                      *\n");         printf("*                    5.修改信息                      *\n");         printf("*                    6.小区总面积排序                *\n");         printf("*                    7.退出系统                      *\n");         printf("*                                                    *\n");         printf("/********************************************************\\\n");         printf("请输入选择项(1-7):");         scanf("%d", &a);         printf("\n\n\n\n");         if(a>0 && a<=7)         {             switch(a)             {                 case 1:xq_input();break;                 case 2:xq_delete();break;                 case 3:xq_listout();break;                 case 4:xq_search();break;                 case 5:xq_change();break;                 case 6:xq_order();break;                 case 7:exit(0);             }         }         else         {             printf("***************************************************************\n");             printf("*                                                    *\n");             printf("*                   按任意键                         *\n");             printf("*                     退出!                          *\n");             printf("*                                                    *\n");             printf("***************************************************************\n");             break;         }     } }  这是主函数； 改了一些我感觉不合适的地方。判断是否在链表中，建议是使用局部变量，全局变量使用完之后需要注意初始化为0。建议还是使用局部变量。 其他地方也做了一些修改，你可以查看一下对比一下。

user: user-1
content: #include<stdio.h> #include<stdlib.h> #include<string.h> //#include<windows.h>  #define len sizeof(struct flat)  struct flat {      char add[100];     char name[100];     float total_area;     int total_num;     struct flat *next; };  typedef struct flat flat;  int n=0, xl[100];  flat *head=NULL;   void create_flat() {     FILE *fp;     int b=0;     long Size;     flat *p1,*p2;     head=(flat *)malloc(sizeof(flat));     memset(head->add,'\0',sizeof(head->add));     memset(head->name,'\0',sizeof(head->name));     head->next=NULL;     if((fp=fopen("xqfile.dat","rb"))==NULL)     {         printf("这是一个新的链表\n");         return;     }     fseek(fp,0L,2);     Size =ftell(fp);     if(!Size)     {         printf("这是一个空链表\n");         return;     }     rewind(fp);     p1=(flat *)malloc(sizeof(flat));     memset(p1->add,'\0',sizeof(p1->add));     memset(p1->name,'\0',sizeof(p1->name));     while(1)     {         if(fread(p1,len,1,fp)==1)         {             p1->next=NULL;             if(head->next==NULL)                 head->next=p1;             else                 p2->next=p1;             p2=p1;             n++;             xl[b]=n;             b++;             p1=(flat *)malloc(sizeof(flat));             memset(p1->add,'\0',sizeof(p1->add));             memset(p1->name,'\0',sizeof(p1->name));         }         else         {             free(p1);             return;         }     }     p2->next=NULL;     fclose(fp); }   void save() {     flat *p=NULL;     FILE *fp;     if((fp=fopen("xqfile.dat","wb"))==NULL)     {         printf("\n打不开文件!\n");         return;     }     if(head->next == NULL)     {         printf("\n信息为空!\n");         return;     }     else     {         p = head->next;     }     while(p!=NULL)     {          fwrite(p,len,1,fp);         p = p->next;     }     printf("保存完毕!\n");     fclose(fp); }    void xq_input() {     struct flat *p1=NULL,*p2=NULL;     char a;     while(1)     {         fflush(stdin);         printf("按q或Q结束录入:");         getchar();         scanf("%c",&a);         getchar();         if(a=='q'||a=='Q')         {             return;         }         else         {             p1=(flat *)malloc(len);             memset(p1->add,'\0',sizeof(p1->add));             memset(p1->name,'\0',sizeof(p1->name));             printf("\n\r请输入地址(字符型):");             scanf("%s",p1->add);             printf("\n\r请输入开发商名(字符型):");             scanf("%s",p1->name);             printf("\n\r请输入总面积:");             scanf("%f",&(p1->total_area));             printf("\n\r请输入总套数:");             scanf("%d",&(p1->total_num));             n++;             xl[n-1]=n;             if(head->next==NULL)             {                 head->next=p1;             }             else             {                 for(p2=head;p2->next!=NULL;p2=p2->next);                 p2->next=p1;             }             p1->next=NULL;             save();         }     } }       void xq_delete() {     flat *p = NULL;     char str[100];     int flag = 0;      if(head->next == NULL)     {         printf("文档中无记录!\n");         return;     }     fflush(stdin);     printf("请输入要删除小区的地址:");     scanf("%s", str);     for(p=head;p->next!=NULL;p=p->next)     {         if(!strcmp(p->next->add,str))         {             flag = 1;             printf("***************************************************************\n");             printf("    小区列表\n");             printf("---------------------------------------------------------------\n");             printf("    地址   开发商名  总套数  总面积    \n");             printf("---------------------------------------------------------------\n");             printf("%8s%8s%8d%10.2f\n", p->next->add,p->next->name,p->next->total_num,p->next->total_area);             printf("---------------------------------------------------------------\n");             printf("***************************************************************\n");             printf("\n");             if(p->next->next)                 p->next=p->next->next;             else                 p->next=NULL;             n--;             save();             printf("删除成功！\n");             //return;             break;         }     }     if(!flag)     {         printf("无该小区信息!请查证!");         return;     } }     void xq_change() {     flat *p=NULL;     char str[100];     int flag = 0;      if(head==NULL)     {         printf("文档中无记录!\n");         return;     }     printf("请输入要修改小区的地址:");     scanf("%s",str);     for(p=head;p!=NULL;p=p->next)     {         if(!strcmp(p->add,str))         {             flag = 1;             printf("***************************************************************\n");             printf("    小区列表\n");             printf("---------------------------------------------------------------\n");             printf("    地址   开发商名  总套数  总面积    \n");             printf("---------------------------------------------------------------\n");             printf("%8s%8s%8d%10.2f\n",p->add,p->name,p->total_num,p->total_area);             printf("---------------------------------------------------------------\n");             printf("***************************************************************\n");             printf("\n");             printf("***************************************************************\n");             printf("\n请输入修改小区的地址:");             scanf("%s",p->add);             printf("\n请输入修改小区的开发商名:");             scanf("%s",p->name);             printf("\n请输入修改小区的总面积:");             scanf("%f",&p->total_area);             printf("\n请输入修改小区的总套数:");             scanf("%d",&p->total_num);             printf("\n");             save();             printf("修改成功！\n");         }     }     if(!flag)     {         printf("无该小区信息!请查证!");     }  }    void xq_listout() {      flat *p=NULL;     int b;     if(head->next==NULL)     {         printf("文档中无记录！\n");         return;     }     printf("***************************************************************\n");     printf("    小区列表:\n");     printf("---------------------------------------------------------------\n");     printf("     序列    地址  开发商名  总套数  总面积    \n");     printf("---------------------------------------------------------------\n");     for(p=head->next,b=0;p!=NULL;p=p->next,b++)     {          printf("%8d%8s%8s%8d%10.2f\n",xl[b],p->add,p->name,p->total_num,p->total_area);     }     printf("---------------------------------------------------------------\n"); }    void xq_search() {     flat *p=NULL;     char str[100];     int flag = 0;      if(head->next==NULL)     {         printf("文档中无记录！\n");         return;     }     printf("请输入要查找的小区地址:");     scanf("%s",str);     printf("***************************************************************\n");     printf("   查询的结果:\n");     printf("---------------------------------------------------------------\n");     printf("    地址   开发商名  总套数  总面积    \n");     printf("---------------------------------------------------------------\n");     for(p=head->next;p!=NULL;p=p->next)     {         if(!strcmp(p->add,str)) {             flag = 1;             printf("%8s%8s%8d%10.2f\n",p->add,p->name,p->total_num,p->total_area);         }     }     if(!flag)     {         printf("无该小区信息!请查证!\n");     }     printf("---------------------------------------------------------------\n");     printf("***************************************************************\n"); }  void xq_order() {     flat *first,*t,*p,*q,*head1;     int b;     head1=head->next;     if(head1==NULL)     {         printf("文档中无记录！\n");         return;     }     first=head1->next;     head1->next=NULL;     while(first != NULL)     {         for(t=first,q=head1;((q!=NULL)&&(q->total_area > t->total_area));p=q,q=q->next);         first=first->next;         if(q==head1)         {             head1=t;         }         else         {             p->next=t;         }         t->next=q;     }     head->next=head1;     printf("***************************************************************\n");     printf("    小区列表:\n");     printf("---------------------------------------------------------------\n");     printf("     序列    地址  开发商名  总套数  总面积    \n");     printf("---------------------------------------------------------------\n");     for(p=head->next,b=0;p!=NULL;p=p->next,b++)     {          printf("%8d%8s%8s%8d%10.2f\n",xl[b],p->add,p->name,p->total_num,p->total_area);     }     printf("---------------------------------------------------------------\n"); }

user: user-2
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-3
content: 没有发现你说的错误啊，只是一些提示语句的位置不对而已

user: user-4
content: 你是学生？还是小区管理人员？

user: user-0
content: 这是程序： #include<stdio.h> #include<stdlib.h> #include<string.h> #include<windows.h>  #define len sizeof(struct flat)   struct flat {  	char add[100]; 	char name[100]; 	float total_area; 	int total_num; 	struct flat *next; };    typedef struct flat flat; int n=0,i=0,xl[100]; flat *head=NULL;   void create_flat() { 	FILE *fp; 	int b=0; 	long Size; 	flat *p1,*p2; 	head=(flat *)malloc(sizeof(flat)); 	memset(head->add,'\0',sizeof(head->add));     memset(head->name,'\0',sizeof(head->name)); 	head->next=NULL; 	if((fp=fopen("xqfile.dat","rb"))==NULL)     { 		printf("这是一个新的链表\n"); 		return; 	} 	fseek(fp,0L,2); 	Size =ftell(fp); 	if(!Size) 	{        printf("这是一个空链表\n"); 	   return; 	}     rewind(fp); 	p1=(flat *)malloc(sizeof(flat));     memset(p1->add,'\0',sizeof(p1->add)); 	memset(p1->name,'\0',sizeof(p1->name)); 	while(1) 	{ 		if(fread(p1,len,1,fp)==1) 		{ 		p1->next=NULL; 		if(head->next==NULL) 			head->next=p1; 		else 			p2->next=p1; 		p2=p1;         n++; 		xl[b]=n; 		b++; 		p1=(flat *)malloc(sizeof(flat));      	memset(p1->add,'\0',sizeof(p1->add)); 	    memset(p1->name,'\0',sizeof(p1->name));         } 		else 		{ 			free(p1); 			return; 		} 	} 	p2->next=NULL; 	fclose(fp); }                 void save()  { 	 flat *p=NULL; 	 FILE *fp; 	 if((fp=fopen("xqfile.dat","wb"))==NULL) 	 { 		 printf("\n打不开文件!\n"); 		 return; 	 } 	 if(head->next==NULL) 	 { 		 printf("\n信息为空!\n"); 		 return; 	 } 	 else 		 p=head->next; 	 while(p!=NULL) 	 {  		 fwrite(p,len,1,fp); 		 p=p->next; 	 } 	 printf("保存完毕!\n"); 	 fclose(fp);  }                         void xq_input() {       struct flat *p1=NULL,*p2=NULL; 	char a; 	while(1) 	{ 	fflush(stdin); 	printf("按q或Q结束录入:"); 	scanf("%c",&a); 	if(a=='q'||a=='Q') 	{ 		return; 	} 	else 	{     p1=(flat *)malloc(len);  	memset(p1->add,'\0',sizeof(p1->add)); 	memset(p1->name,'\0',sizeof(p1->name)); 	printf("\n\r请输入地址(字符型):"); 	scanf("%s",p1->add); 	printf("\n\r请输入开发商名(字符型):"); 	scanf("%s",p1->name);	 	printf("\n\r请输入总面积:"); 	scanf("%f",&(p1->total_area));			 	printf("\n\r请输入总套数:"); 	scanf("%d",&(p1->total_num)); 	n++; 	xl[n-1]=n; 	if(head->next==NULL) 	{ 	    head->next=p1; 	} 	else 	{ 	    for(p2=head;p2->next!=NULL;p2=p2->next); 		p2->next=p1; 	} 	p1->next=NULL;			     save(); 	} 	} }       void xq_delete() { 	flat *p=NULL; 	char str[100]; 		if(head->next==NULL) 	{ 		printf("文档中无记录!\n"); 		return; 	}     fflush(stdin); 	printf("请输入要删除小区的地址:"); 	scanf("%s",str); 	for(p=head;p->next!=NULL;p=p->next) 	{ 		if(!strcmp(p->next->add,str)) 		{ 			i=1; 			printf("***************************************************************\n");            	printf("    小区列表\n"); 			printf("---------------------------------------------------------------\n"); 		    printf("    地址   开发商名  总套数  总面积    \n"); 			printf("---------------------------------------------------------------\n"); 	        printf("%8s%8s%8d%10.2f\n",p->next->add,p->next->name,p->next->total_num,p->next->total_area);             printf("---------------------------------------------------------------\n"); 	 	    printf("***************************************************************\n"); 			printf("\n");             if(p->next->next) 				p->next=p->next->next; 			else 				p->next=NULL; 			n--; 			save(); 			printf("删除成功！\n"); 			return; 		}            if(i!=1) 		   { 			   printf("无该小区信息!请查证!"); 			   return; 		   } 	} }     void xq_change() { 	flat *p=NULL; 	char str[100]; 	if(head==NULL) 	{ 		printf("文档中无记录!\n"); 		return; 	} 	printf("请输入要修改小区的地址:"); 	scanf("%s",str); 	for(p=head;p!=NULL;p=p->next) 	{ 		if(!strcmp(p->add,str)) 		{ 		 			printf("***************************************************************\n");            	printf("    小区列表\n"); 			printf("---------------------------------------------------------------\n"); 		    printf("    地址   开发商名  总套数  总面积    \n"); 			printf("---------------------------------------------------------------\n"); 	        printf("%8s%8s%8d%10.2f\n",p->add,p->name,p->total_num,p->total_area);             printf("---------------------------------------------------------------\n"); 	 	    printf("***************************************************************\n"); 			printf("\n"); 			i=1;             printf("***************************************************************\n"); 			printf("\n请输入修改小区的地址:"); 			scanf("%s",p->add); 			printf("\n请输入修改小区的开发商名:"); 			scanf("%s",p->name); 			printf("\n请输入修改小区的总面积:"); 			scanf("%f",&p->total_area); 			printf("\n请输入修改小区的总套数:"); 			scanf("%d",&p->total_num); 			printf("\n"); 			save(); 			printf("修改成功！\n"); 		} 	} 	if(!i) 	{ 		printf("无该小区信息!请查证!"); 	}     }    void xq_listout() { 	 	flat *p=NULL; 	int b; 	if(head->next==NULL) 	{ 		printf("文档中无记录！\n"); 		return; 	} 	printf("***************************************************************\n"); 	printf("    小区列表:\n"); 	printf("---------------------------------------------------------------\n");     printf("     序列    地址  开发商名  总套数  总面积    \n");     printf("---------------------------------------------------------------\n"); 	for(p=head->next,b=0;p!=NULL;p=p->next,b++) 	{                  printf("%8d%8s%8s%8d%10.2f\n",xl[b],p->add,p->name,p->total_num,p->total_area); 	}     printf("---------------------------------------------------------------\n"); }    void xq_search() { 	flat *p=NULL; 	char str[100];     if(head->next==NULL) 	{ 		printf("文档中无记录！\n"); 		return; 	} 	printf("请输入要查找的小区地址:"); 	scanf("%s",str);     printf("***************************************************************\n"); 	printf("   查询的结果:\n"); 	printf("---------------------------------------------------------------\n");     printf("    地址   开发商名  总套数  总面积    \n");     printf("---------------------------------------------------------------\n");     for(p=head->next;p!=NULL;p=p->next) 	{ 		if(!strcmp(p->add,str)) 		{ 			i=1; 			printf("%8s%8s%8d%10.2f\n",p->add,p->name,p->total_num,p->total_area); 		} 	} 	if(!i) 	{ 		printf("无该小区信息!请查证!"); 	}        printf("---------------------------------------------------------------\n"); 	   printf("***************************************************************\n"); }  void xq_order() { 	flat *first,*t,*p,*q,*head1; 	int b; 	head1=head->next; 		if(head1==NULL) 	{ 		printf("文档中无记录！\n"); 		return; 	} 	first=head1->next; 	head1->next=NULL; 	while(first != NULL) 	{ 		for(t=first,q=head1;((q!=NULL)&&(q->total_area > t->total_area));p=q,q=q->next);         first=first->next; 		if(q==head1) 		{ 			head1=t; 		} 		else 		{ 			p->next=t; 		} 		t->next=q; 	}      head->next=head1; 	printf("***************************************************************\n"); 	printf("    小区列表:\n"); 	printf("---------------------------------------------------------------\n");     printf("     序列    地址  开发商名  总套数  总面积    \n");     printf("---------------------------------------------------------------\n"); 		for(p=head->next,b=0;p!=NULL;p=p->next,b++) 	{                  printf("%8d%8s%8s%8d%10.2f\n",xl[b],p->add,p->name,p->total_num,p->total_area); 	}     printf("---------------------------------------------------------------\n"); }    void main() { 	int a; 	create_flat(); 	while(1) 	{ 		printf("\n"); 		printf("/********************************************************\\\n"); 		printf("*                                                    *\n"); 	    printf("*                城市小区管理信息系统                *\n"); 		printf("*                      主菜单                        *\n"); 	    printf("*                                                    *\n"); 		printf("*                    1.录入(增加)信息                *\n"); 	    printf("*                    2.删除信息                      *\n"); 		printf("*                    3.输出信息                      *\n"); 		printf("*                    4.查找信息                      *\n"); 		printf("*                    5.修改信息                      *\n"); 		printf("*                    6.小区总面积排序                *\n");      	printf("*                    7.退出系统                      *\n");         printf("*                                                    *\n"); 		printf("/********************************************************\\\n"); 		printf("请输入选择项(1-7):"); 		scanf("%d",&a); 		printf("\n\n\n\n"); 		if(a>0 && a<=7) 		{ 			switch(a) 			{ 			case 1:xq_input();break; 			case 2:xq_delete();break; 			case 3:xq_listout();break; 			case 4:xq_search();break; 			case 5:xq_change();break;             case 6:xq_order();break; 			case 7:exit(0); 			} 		} 		else 		{              printf("***************************************************************\n"); 			 printf("*                                                    *\n"); 		     printf("*                   按任意键                         *\n"); 			 printf("*                     退出!                          *\n"); 			 printf("*                                                    *\n"); 			 printf("***************************************************************\n");              break;    		} 	} }