user-0 提问: 职工管理系统，一录入信息就会停止运行

回复:
user: user-1
content: 你好歹把代码套上格式在发嘛，这样看的好累

user: user-2
content: Listpaixu，这函数名、。。。 要不改成“ListMalaxiangguo”

user: user-2
content: 楼主，你的代码看着头大，我整理了一下，另外做了编译，编译结果附在后面；其余的你自己搞定好了，看着怕了。。  #include <stdio.h> #include <stdlib.h> #include <string.h> #include <malloc.h>  #define EMPLOYEEMAX  100  typedef struct st_Data { 	char      dsex; 	char      dname[EMPLOYEEMAX]; 	char      ddegree[EMPLOYEEMAX]; 	char      djob[EMPLOYEEMAX]; 	char      daddress[EMPLOYEEMAX]; 	long int  dborn_date,  dwork_date,  dtele_num; } DataInfo;  typedef struct Node { 	struct Node   *next; 	DataInfo       data; 	#ifndef STRUCT_data_ALIAS 	#define STRUCT_data_ALIAS 	#define  sex        data.dsex 	#define  name       data.dname 	#define  degree     data.ddegree 	#define  job        data.djob 	#define  address    data.daddress 	#define  born_date  data.dborn_date 	#define  work_date  data.dwork_date 	#define  tele_num   data.dtele_num 	#endif  // #define STRUCT_data_ALIAS } EMPLOYEENode;  // 链表初始化 void ListIniti(EMPLOYEENode **head) { 	if (NULL == (*head = (EMPLOYEENode *) malloc(sizeof(EMPLOYEENode)))) 	{ 		printf("Allocate memory for list failed!\n"); 		exit(1); 	} 	 	(*head)->next = NULL; }  // 职工信息的插入姓名并按照升序排列 EMPLOYEENode *ListInsert(EMPLOYEENode *head, DataInfo x) { 	EMPLOYEENode   *p,  *q,  *s;  	p = head->next; 	if(NULL == (q = (EMPLOYEENode *) malloc(sizeof(EMPLOYEENode)))) 	{ 		// 此处内存溢出... 		exit(1); 	}  	q->born_date = x.dborn_date; 	q->work_date = x.dwork_date; 	q->tele_num  = x.dtele_num; 	strncpy_s(q->name, strlen(x.dname)+1, x.dname, EMPLOYEEMAX); 	q->sex       = x.dsex; 	strncpy_s(q->degree, strlen(x.ddegree)+1, x.ddegree, EMPLOYEEMAX); 	strncpy_s(q->job, strlen(x.djob)+1, x.djob, EMPLOYEEMAX); 	strncpy_s(q->address, strlen(x.daddress)+1, x.daddress, EMPLOYEEMAX);  	// 如果只有链表的头结点，没有其他的结点，直接插入在头结点后面 	if(NULL == head->next) { 		head->next = q; 		head->next->next = NULL; 		return head; 	} 	 	for(/*NULL*/; p; p = p->next) { 		if(NULL != p->next) { 			// 位于两个结点之间 			if(strcmp(p->name, x.dname) < 0 && strcmp(p->next->name, x.dname) > 0) { 				s = p->next; 				p->next = q; 				q->next = s; 				break; 			} else if(strcmp(p->name, x.dname) < 0 && p->next == NULL) {  // 链表非空，并且在排序中是最后一个 				// else if(strcmp(p->name,x.name)==0)break;   //如果姓名相同则不插入信息} 				p->next = q; 				q->next = NULL; 				break; 			}  			// 位于链表头结点之后的位置 			if(strcmp(p->name, x.dname)>0) { 				s=head->next; 				head->next=q; 				q->next=s; 				break; 			} 		} 	} 	return head; }  void main(void) { 	DataInfo   x; 	EMPLOYEENode    *head; 	int        i,  n; 	FILE      *fp;  	// 初始化链表 	ListIniti(&head); 	 	printf("\n"); 	printf("*******************************************************************************\n" 	       "************************    欢迎使用职工管理系统    ***************************\n" 	       "*******************************************************************************\n" 	       "\n请输入要录入的职工人数n："); 	fflush(NULL); 	scanf_s("%d", &n); 	if(0 == n) { 		goto aa; 	} 	 	printf("请输入职工信息：\n姓名、性别、出生年月、工作年月、学历、职务、住址、电话\n"); 	for (i=0; i<n; i++)	{ 		scanf_s("%s %c %d %d %s %s %s %d", x.dname, &x.dsex, &x.dborn_date, &x.dwork_date, 			    x.ddegree, x.djob, x.daddress, &x.dtele_num); 		head = ListInsert(head, x); 	} 	 	if (fopen_s(&fp, "Employeetxt", "rd")) { 		printf("\t无法打开'Employee.txt'!\n"); 		exit(0); 	} 	put(head, fp); 	if (fclose(fp)) { 		printf("\t无法关闭'Employee.txt'!\n"); 		exit(0); 	} 	printLink(head);  	while(1) { aa:		printf("\n\t                      * 主菜单 *        \n" 		       "\t                        **********        \n" 		       "\t  \t0.结束管理系统\t\t\t1.新增职工信息\t\t\n" 			   "\t  \t2.删除职工信息\t\t\t3.查询职工信息\t\t\n" 			   "\t  \t4.修改职工信息\t\t\t5.职工信息排序\t\t\n" 		       "请输入您要选择的操作：");  		scanf_s("%d", &i); 		switch(i) 		{ 		case  0:  // 结束系统 			printf("\t\t您已经成功退出职工管理系统,谢谢使用!\n"); 			goto FINISH_LOOP;  		case  1:  // 新增一名职工 			printf("请输入职工信息：\n姓名、性别、出生年月、工作年月、学历、职务、住址、电话\n"); 			scanf_s("%s %c %d %d %s %s %s %d", x.dname, &x.dsex, &x.dborn_date, &x.dwork_date, 				    x.ddegree, x.djob, x.daddress, &x.dtele_num); 			head=ListInsert(head,x); 			printf("新增成功！请继续操作！\n"); 			printLink(head); 			 			// 保存在文件中 			put(head, fp); 			continue;  		case  2:  // 删除一名职工 			ListDelete(head); 			if (fopen_s(&fp, "Employee.txt", "w")) { 				printf("无法打开'职工名单.txt'!\n"); 				exit(0); 			} 			put(head,fp); 			if (fclose(fp)) { 				printf("无法关闭'Employee.txt'!\n"); 				exit(0); 			} 			continue;  		case  3:  // 查找一名职工 			Listfind(*head); 			continue;  		case  4:  // 修改职工信息 			ListModify(head); 			if (fopen_s(&fp, "Employee.txt", "w")) { 				printf("无法打开'Employee.txt'!\n"); 				exit(0); 			} 			put(head, fp); 			if (fclose(fp)) { 				printf("无法关闭'Employee.txt'!\n"); 				exit(0); 			} 			continue;  		case  5:  // 对职工信息进行排序 			EMPLOYEENode *p = head; 			Listpaixu(p);  // 函数未定义 			continue;  		default:  // 输入出错 			printf("输入出错！请再次输入！\n"); 			continue; 		}  FINISH_LOOP: 		break; 	} }   编译结果  1>------ 已启动全部重新生成: 项目: exam013, 配置: Debug Win32 ------ 1>正在删除项目“exam013”(配置“Debug|Win32”)的中间文件和输出文件 1>正在编译... 1>employee_cmp.c 1>f:\exam013\exam013\employee_cmp.c(130) : warning C4013: “put”未定义；假设外部返回 int 1>f:\exam013\exam013\employee_cmp.c(135) : warning C4013: “printLink”未定义；假设外部返回 int 1>f:\exam013\exam013\employee_cmp.c(165) : warning C4013: “ListDelete”未定义；假设外部返回 int 1>f:\exam013\exam013\employee_cmp.c(178) : warning C4013: “Listfind”未定义；假设外部返回 int 1>f:\exam013\exam013\employee_cmp.c(182) : warning C4013: “ListModify”未定义；假设外部返回 int 1>f:\exam013\exam013\employee_cmp.c(195) : error C2275: “EMPLOYEENode”: 将此类型用作表达式非法 1>        f:\exam013\exam013\employee_cmp.c(31) : 参见“EMPLOYEENode”的声明 1>f:\exam013\exam013\employee_cmp.c(195) : error C2065: “p”: 未声明的标识符 1>f:\exam013\exam013\employee_cmp.c(196) : warning C4013: “Listpaixu”未定义；假设外部返回 int 1>生成时间 0:00 1>生成日志保存在“********************************************” 1>exam013 - 2 个错误，6 个警告 ========== 全部重新生成: 0 已成功, 1 已失败, 0 已跳过 ==========

user: user-3
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。