user-0 提问: 求助！！！怎么不用全局变量实现这些功能

回复:
user: user-1
content: 引用 3 楼 Rhinedusk 的回复:[quote=引用 1 楼 paschen 的回复:] 全局变量只有一个head啊 你把他定义成局部变量，调用函数时，作为参数传递给函数即可void start() { //开始界面 	int a=0; 	int b=0; 	int A=15080121; 	getchar(); 	system("cls"); 	printf("\n\n\n"); 	printf("\t\t学生信息管理系统\n\n\n"); 	printf("\t\t\t2.33.Ver\n\n\n"); 	getchar(); 	system("cls"); /*	printf("\t\t请输入用户名和密码，按下Enter继续\n\n\n"); 	printf("\tAdmin:"); 	scanf("%d",&a); 	printf("\n"); 	printf("\tPassword:"); 	scanf("%d",&b); 	if(a==A&&b==A) { 		getchar(); 		system("cls"); 	} else { 		printf("\t\t\t您没有足够的权限！！！！！\nPlease Press Enter to EXIT……"); 		getchar(); 		exit(0); 	}*/ }  int menu() {//菜单 	int shuru=0; 	printf("\n\n\n"); 	printf("\t\t （1）Create a student list\n"); 	printf("\t\t （2）Insert a student\n");//(to the sorted array or the sorted linked list ) 	printf("\t\t （3）Delete a student\n"); 	printf("\t\t （4）Search a student\n"); 	printf("\t\t （5）Display all students\n"); 	printf("\t\t （6）exit\n"); 	printf("\t\t请选择功能:"); 	scanf("%d",&shuru); 	return shuru;  }      SIS* input() {//输入、插入 	Student *p1,*p2; 	Student *student; 	Student *head=NULL; 	char a = 'y';  	system("cls");  	student = (Student*) malloc (LEN); 	printf("\t请按照要求输入\n"); 	while(a=='y'||a=='Y') { 		p2=p1=head; 		printf("\tStudentID："); 		scanf("%ld",&student->StudentID); 		printf("\t"); 		printf("Name："); 		scanf("%s",student->Name); 		printf("\t"); 		printf("Sex："); 		scanf("%s",&student->Sex); 		printf("\t"); 		printf("Age："); 		scanf("%d",&student->Age); 		printf("\t"); 		printf("TOE："); 		scanf("%s",&student->TOE); 		printf("\t"); 		printf("GPA："); 		scanf("%f",&student->GPA); 		printf("\t"); 		printf("PhoneNo："); 		scanf("%s",&student->PhoneNo); 		printf("\t"); 		printf("MailingAddress："); 		scanf("%s",&student->MailingAddress); 		printf("\n\n\n\n"); 		student->next=NULL; 		fflush(stdin); 		if(head==NULL)head=student; 		else { 			while(p1->StudentID<student->StudentID&&p1->next!=NULL) { 				p2=p1; 				p1=p1->next; 			} 			if(p1->StudentID>student->StudentID) 				if(p1==head) { 					student->next=head; 					head=student; 				} else { 					p2->next=student; 					student->next=p1; 				} 			else p1->next=student; 		} 		student = (Student *) malloc (LEN); 		printf("是否继续添加,输入'y'或'Y'继续\n"); 		a=getchar(); 		fflush(stdin); 	} 	printf("\t\t\t录入成功!\n"); 	free(student); 	return (head); }    SIS* del(Student *head) {			//删除学生信息 	Student *p1,*p2; 	int tage = 0; 	long StudentID; 	system("cls"); 	p1=head; 	printf("\n\t\t请输入学号:"); 	scanf("%d",&StudentID); 	if(head==NULL) { 		printf("不存在学生信息!\n"); 		return 0; 	} 	while(p1!=NULL) { 		if(p1->StudentID==StudentID) { 			tage=1; 			if(p1==head)head=head->next; 			else p2->next=p1->next; 			free(p1); 			break; 		} 		p2=p1; 		p1=p1->next; 	} 	if(tage==0) printf("要删除的学生信息不存在!\n"); 	tage=0; 	printf("\t\t\t成功删除息\n"); 	fflush(stdin); //	system("cls");  	return (head); }  int search (Student *head) {	  //查询 	Student *p1; 	Student *student; 	int tage = 0; 	long StudentID;  	system("cls"); 	printf("请输入要查询的学生学号："); 	scanf("%d",&StudentID); 	p1=head; 	if(head==NULL) { 		printf("无学生信息!\n"); 		return 0; 	} else 		while(p1!=NULL) 			if(p1->StudentID==StudentID) { 				tage=1; 				printf("你查找的学生信息如下:\n"); 				printf("\t\tStudentID：%ld\n",p1->StudentID); 				printf("\t\tName：%s\n",p1->Name); 				printf("\t\tSex：%s\n",p1->Sex); 				printf("\t\tAge：%d\n",p1->Age); 				printf("\t\tTOE：%s\n",p1->TOE); 				printf("\t\tGPA：%2f\n",p1->GPA); 				printf("\t\tPhonrNo：%s\n",p1->PhoneNo); 				printf("\t\tMailingAddress：%s\n\n\n",&p1->MailingAddress); 				break; 			}   			else  p1=p1->next; 	if(tage==0)printf("\t\t\t无该学生信息!\n"); 	tage=0; 	fflush(stdin);  	return 0; }  int ALL(Student *head) { //显示全部信息 	Student *p1; 	p1 = head; 	system("cls"); 	if(head==NULL) { 		printf("无学生信息!\n"); 		return 0; 	} 	while(p1!=NULL) { 		printf("\t\tStudentID：%ld\n",p1->StudentID); 		printf("\t\tName：%s\n",p1->Name); 		printf("\t\tSex：%s\n",p1->Sex); 		printf("\t\tAge：%d\n",p1->Age); 		printf("\t\tTOE：%s\n",p1->TOE); 		printf("\t\tGPA：%2f\n",p1->GPA); 		printf("\t\tPhonrNo：%s\n",p1->PhoneNo); 		printf("\t\tMailingAddress：%s\n\n",p1->MailingAddress); 		p1=p1->next; 	} 	return 0; }    main() { 	int choose; 	int x=1; 	Student *head=NULL;  	wellcome(); 	start(); 	while(x) { 		choose=menu(); 		switch(choose) { 			case 1: { 				input(); 				system("pause"); 				printf("Please Press Enter to Return……"); 				getchar(); 				system("cls"); 				break; 			}   			case 2: { 				input(); 				system("pause"); 				printf("Please Press Enter to Return……"); 				getchar(); 				system("cls"); 				break; 			}   			case 3: { 				del(head); 				system("pause"); 				printf("Please Press Enter to Return……"); 				getchar(); 				system("cls"); 				break; 			}   			case 4: { 				search(head); 				system("pause"); 				printf("Please Press Enter to Return……"); 				getchar(); 				system("cls"); 				break; 			}   			case 5: { 				ALL(head); 				system("pause"); 				printf("Please Press Enter to Return……"); 				getchar(); 				system("cls"); 				break; 			}   			case 6: { 				exit(1); 			}   			default: { 				system("cls"); 				printf("\n\n\n\t\t\t无此功能\n\n\n\n"); 				break; 			} 		}  	} }  这样吗？好像传递不出去 [/quote]  如果你要在函数中修改这个指针，那么你应该传指针的指针进去，否则你传入的参数是复制到函数内部的，你在函数内部修改的都是对那个复制品的修改

user: user-0
content: 引用 10楼zhouxiaofeng1021 的回复:又是你呀~~~这个代码 我已经帮你改过了~~~代码写的 ~~~ 输入有问题还是在运行ALL输出的时候会输出别的结果

user: user-2
content: 又是你呀~~~这个代码 我已经帮你改过了~~~代码写的 ~~~ 输入有问题

user: user-3
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后，就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！ 指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认：  有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物；  而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。  不要企图依赖输出指针相关表达式...的值【比如printf("%p\n",...);或者cout<<...】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=(void *)(...);】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  提醒： “学习用汇编语言写程序” 和 “VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 （Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。） 想要从本质上理解C指针，必须学习C和汇编的对应关系。” 不是一回事！  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  十字链表交换任意两个节点C源代码（C指针应用终极挑战）http://download.csdn.net/detail/zhao4zhong1/5532495

user: user-4
content: 函数多一个参数（指针）就行了  需要修改指针，传指针的指针(C,C++)，或者指针的引用（C++） 不需要修改指针。需要修改对象，传指针（对象地址） 不需要修改对象，传值(C,C++)，const 引用（C++），const 指针(C,C++) 需要修改对象，传指针(C,C++)，传引用（C++）。 指针，可以传递单个数据，也可传递一批数据（数组，链表等）

user: user-0
content: 求助怎么传递参数

user: user-0
content: 引用 4楼动力风暴 的回复:我感觉将head定义成全局变量和作局部变量当入参传递都可以…… 楼主可以试下~~~我想知道怎么传递..传参一直是弱点

user: user-5
content: 全局变量当然也可以，但是全局变量在程序执行过程中不释放，所以占资源，另外变量如果多的话都定义成全局变量容易造成变量名污染

user: user-6
content: 我感觉将head定义成全局变量和作局部变量当入参传递都可以…… 楼主可以试下~~~

user: user-0
content: 引用 1 楼 paschen 的回复:全局变量只有一个head啊 你把他定义成局部变量，调用函数时，作为参数传递给函数即可void start() { //开始界面 	int a=0; 	int b=0; 	int A=15080121; 	getchar(); 	system("cls"); 	printf("\n\n\n"); 	printf("\t\t学生信息管理系统\n\n\n"); 	printf("\t\t\t2.33.Ver\n\n\n"); 	getchar(); 	system("cls"); /*	printf("\t\t请输入用户名和密码，按下Enter继续\n\n\n"); 	printf("\tAdmin:"); 	scanf("%d",&a); 	printf("\n"); 	printf("\tPassword:"); 	scanf("%d",&b); 	if(a==A&&b==A) { 		getchar(); 		system("cls"); 	} else { 		printf("\t\t\t您没有足够的权限！！！！！\nPlease Press Enter to EXIT……"); 		getchar(); 		exit(0); 	}*/ }  int menu() {//菜单 	int shuru=0; 	printf("\n\n\n"); 	printf("\t\t （1）Create a student list\n"); 	printf("\t\t （2）Insert a student\n");//(to the sorted array or the sorted linked list ) 	printf("\t\t （3）Delete a student\n"); 	printf("\t\t （4）Search a student\n"); 	printf("\t\t （5）Display all students\n"); 	printf("\t\t （6）exit\n"); 	printf("\t\t请选择功能:"); 	scanf("%d",&shuru); 	return shuru;  }      SIS* input() {//输入、插入 	Student *p1,*p2; 	Student *student; 	Student *head=NULL; 	char a = 'y';  	system("cls");  	student = (Student*) malloc (LEN); 	printf("\t请按照要求输入\n"); 	while(a=='y'||a=='Y') { 		p2=p1=head; 		printf("\tStudentID："); 		scanf("%ld",&student->StudentID); 		printf("\t"); 		printf("Name："); 		scanf("%s",student->Name); 		printf("\t"); 		printf("Sex："); 		scanf("%s",&student->Sex); 		printf("\t"); 		printf("Age："); 		scanf("%d",&student->Age); 		printf("\t"); 		printf("TOE："); 		scanf("%s",&student->TOE); 		printf("\t"); 		printf("GPA："); 		scanf("%f",&student->GPA); 		printf("\t"); 		printf("PhoneNo："); 		scanf("%s",&student->PhoneNo); 		printf("\t"); 		printf("MailingAddress："); 		scanf("%s",&student->MailingAddress); 		printf("\n\n\n\n"); 		student->next=NULL; 		fflush(stdin); 		if(head==NULL)head=student; 		else { 			while(p1->StudentID<student->StudentID&&p1->next!=NULL) { 				p2=p1; 				p1=p1->next; 			} 			if(p1->StudentID>student->StudentID) 				if(p1==head) { 					student->next=head; 					head=student; 				} else { 					p2->next=student; 					student->next=p1; 				} 			else p1->next=student; 		} 		student = (Student *) malloc (LEN); 		printf("是否继续添加,输入'y'或'Y'继续\n"); 		a=getchar(); 		fflush(stdin); 	} 	printf("\t\t\t录入成功!\n"); 	free(student); 	return (head); }    SIS* del(Student *head) {			//删除学生信息 	Student *p1,*p2; 	int tage = 0; 	long StudentID; 	system("cls"); 	p1=head; 	printf("\n\t\t请输入学号:"); 	scanf("%d",&StudentID); 	if(head==NULL) { 		printf("不存在学生信息!\n"); 		return 0; 	} 	while(p1!=NULL) { 		if(p1->StudentID==StudentID) { 			tage=1; 			if(p1==head)head=head->next; 			else p2->next=p1->next; 			free(p1); 			break; 		} 		p2=p1; 		p1=p1->next; 	} 	if(tage==0) printf("要删除的学生信息不存在!\n"); 	tage=0; 	printf("\t\t\t成功删除息\n"); 	fflush(stdin); //	system("cls");  	return (head); }  int search (Student *head) {	  //查询 	Student *p1; 	Student *student; 	int tage = 0; 	long StudentID;  	system("cls"); 	printf("请输入要查询的学生学号："); 	scanf("%d",&StudentID); 	p1=head; 	if(head==NULL) { 		printf("无学生信息!\n"); 		return 0; 	} else 		while(p1!=NULL) 			if(p1->StudentID==StudentID) { 				tage=1; 				printf("你查找的学生信息如下:\n"); 				printf("\t\tStudentID：%ld\n",p1->StudentID); 				printf("\t\tName：%s\n",p1->Name); 				printf("\t\tSex：%s\n",p1->Sex); 				printf("\t\tAge：%d\n",p1->Age); 				printf("\t\tTOE：%s\n",p1->TOE); 				printf("\t\tGPA：%2f\n",p1->GPA); 				printf("\t\tPhonrNo：%s\n",p1->PhoneNo); 				printf("\t\tMailingAddress：%s\n\n\n",&p1->MailingAddress); 				break; 			}   			else  p1=p1->next; 	if(tage==0)printf("\t\t\t无该学生信息!\n"); 	tage=0; 	fflush(stdin);  	return 0; }  int ALL(Student *head) { //显示全部信息 	Student *p1; 	p1 = head; 	system("cls"); 	if(head==NULL) { 		printf("无学生信息!\n"); 		return 0; 	} 	while(p1!=NULL) { 		printf("\t\tStudentID：%ld\n",p1->StudentID); 		printf("\t\tName：%s\n",p1->Name); 		printf("\t\tSex：%s\n",p1->Sex); 		printf("\t\tAge：%d\n",p1->Age); 		printf("\t\tTOE：%s\n",p1->TOE); 		printf("\t\tGPA：%2f\n",p1->GPA); 		printf("\t\tPhonrNo：%s\n",p1->PhoneNo); 		printf("\t\tMailingAddress：%s\n\n",p1->MailingAddress); 		p1=p1->next; 	} 	return 0; }    main() { 	int choose; 	int x=1; 	Student *head=NULL;  	wellcome(); 	start(); 	while(x) { 		choose=menu(); 		switch(choose) { 			case 1: { 				input(); 				system("pause"); 				printf("Please Press Enter to Return……"); 				getchar(); 				system("cls"); 				break; 			}   			case 2: { 				input(); 				system("pause"); 				printf("Please Press Enter to Return……"); 				getchar(); 				system("cls"); 				break; 			}   			case 3: { 				del(head); 				system("pause"); 				printf("Please Press Enter to Return……"); 				getchar(); 				system("cls"); 				break; 			}   			case 4: { 				search(head); 				system("pause"); 				printf("Please Press Enter to Return……"); 				getchar(); 				system("cls"); 				break; 			}   			case 5: { 				ALL(head); 				system("pause"); 				printf("Please Press Enter to Return……"); 				getchar(); 				system("cls"); 				break; 			}   			case 6: { 				exit(1); 			}   			default: { 				system("cls"); 				printf("\n\n\n\t\t\t无此功能\n\n\n\n"); 				break; 			} 		}  	} }  这样吗？好像传递不出去

user: user-7
content: 函数传参‮‮

user: user-1
content: 全局变量只有一个head啊 你把他定义成局部变量，调用函数时，作为参数传递给函数即可