user-0 提问: C语言链表问题

回复:
user: user-1
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0];

user: user-2
content: 引用 7楼我是你的主体 的回复:createMember函数中：  printf("姓名：");scanf("%s",&head->name); printf("性别：");scanf("%s",&head->sex);  这两句中的&去掉和加上&的区别处在哪里你这里加不加&都是一样的，对数组名取地址还是它本身的地址，如果是指针成员才有区别

user: user-3
content: 引用 7 楼 qq_36084484的回复:createMember函数中：  printf("姓名：");scanf("%s",&head->name); printf("性别：");scanf("%s",&head->sex);  这两句中的&去掉和加上&的区别处在哪里 char[]数组不需要加&，因为数组名是可以直接转换成指针的，而id是 int成员，要加&的才能得到指针类型

user: user-3
content: 引用 5 楼 qq_36084484的回复:我检查过了，没有漏写getchar().而且只有第一次的score的值有问题，之后第二次测试结果就正确了，不知道为什么 认真检查，第二次是在add函数里，第一次是在createMember函数里输入  建议不要把多条语句写在一行，不然你很难发现....

user: user-0
content: createMember函数中：  printf("姓名：");scanf("%s",&head->name); printf("性别：");scanf("%s",&head->sex);  这两句中的&去掉和加上&的区别处在哪里

user: user-2
content: 1.你的add函数里，head写成了m(楼上已经说到了) 2.你的score之所以不对，是因为你在输入个人信息的时候输入缓冲区里是有遗留的字符的（包括回车符）。 所以不对，你在start1函数的开头加一句fflush(stdin);清空输入缓冲区就行了  #include <stdio.h> #include <stdlib.h> int score = 0; typedef struct member{ 	char name[10], sex[5]; int id; char type; 	struct member* pNext;  }Member, *PMember;  PMember createMember(){//创造新的头节点 	PMember head = NULL; 	head = (PMember)malloc(sizeof(Member)); 	head->pNext = NULL; 	printf("请输入你的个人信息：\n"); 	printf("学号："); scanf("%d", &head->id); 	printf("姓名："); scanf("%s", &head->name); 	printf("性别："); scanf("%s", &head->sex); 	return head; } void display(PMember head){//显示输出 	system("CLS"); 	if (NULL == head) return; 	PMember temp1 = head; 	printf("\t学号\t姓名\t性别\t测试结果\n"); 	for (; temp1 != NULL; temp1 = temp1->pNext){  		printf("\t%d\t%s\t%s\t%c\n", temp1->id, temp1->name, temp1->sex, temp1->type);   	}  }  void start1(void){ 	fflush(stdin); 	system("CLS"); 	printf("(1)你走路时是……\n"); 	printf("a)大步的快走\n"); 	printf("b)小步的快走\n"); 	printf("c)不快，仰著头面对著世界\n"); 	printf("d)不快，低著头\n"); 	printf("e)很慢\n"); 	char answer; 	printf("你的选择是："); 	scanf("%c", &answer); 	getchar(); 	if (answer == 'a'){ score += 6; } 	if (answer == 'b'){ score += 4; } 	if (answer == 'c'){ score += 7; } 	if (answer == 'd'){ score += 2; } 	if (answer == 'e'){ score += 1; }  } void start2(void){ 	system("CLS"); 	printf("(2)和人说话时，你……\n"); 	printf("a)手臂交叠的站著\n"); 	printf("b)双手紧握著\n"); 	printf("c)一只手或两手放在臀部\n"); 	printf("d)碰著或推著与你说话的人\n"); 	printf("e)玩著你的耳朵、摸著你的下巴、或用手整理头发\n"); 	char answer1; printf("你的选择是："); 	scanf("%c", &answer1); getchar(); 	if (answer1 == 'a'){ score += 4; } 	if (answer1 == 'b'){ score += 2; } 	if (answer1 == 'c'){ score += 5; } 	if (answer1 == 'd'){ score += 7; } 	if (answer1 == 'e'){ score += 6; } } void start3(void){ 	system("CLS"); 	printf("((3)你何时感觉最好?\n"); 	printf("a)早晨\n"); 	printf("b)下午及傍晚\n"); 	printf("c)夜里\n");  	char answer1; printf("你的选择是："); 	scanf("%c", &answer1); getchar(); 	if (answer1 == 'a'){ score += 2; } 	if (answer1 == 'b'){ score += 4; } 	if (answer1 == 'c'){ score += 6; }  } void start4(void){ 	system("CLS"); 	printf("((4)坐著休息时，你的……\n"); 	printf("a)两膝盖并拢\n"); 	printf("b)两腿交插\n"); 	printf("c)两腿伸直\n"); 	printf("d)一腿卷在身下\n"); 	char answer1; printf("你的选择是："); 	scanf("%c", &answer1); getchar(); 	if (answer1 == 'a'){ score += 4; } 	if (answer1 == 'b'){ score += 6; } 	if (answer1 == 'c'){ score += 2; } 	if (answer1 == 'd'){ score += 1; } } void start5(void){ 	system("CLS"); 	printf("(5)碰到你感到发笑的事时，你的反应是……\n"); 	printf("a)一个欣赏的大笑\n"); 	printf("b)笑著，但不大声\n"); 	printf("c)轻声的咯咯地笑\n"); 	printf("d)羞怯的微笑\n"); 	char answer1; printf("你的选择是："); 	scanf("%c", &answer1); getchar(); 	if (answer1 == 'a'){ score += 4; } 	if (answer1 == 'b'){ score += 6; } 	if (answer1 == 'c'){ score += 2; } 	if (answer1 == 'd'){ score += 1; }  } void start6(void){ 	system("CLS"); 	printf("(6)当你去一个派对或社交场合时，你……\n"); 	printf("a)很大声地入场以引起注意\n"); 	printf("b)安静地入场，找你认识的人\n"); 	printf("c)非常安静地入场，尽量保持不被注意\n");  	char answer1; printf("你的选择是："); 	scanf("%c", &answer1); getchar(); 	if (answer1 == 'a'){ score += 6; } 	if (answer1 == 'b'){ score += 4; } 	if (answer1 == 'c'){ score += 2; }  } void start7(void){ 	system("CLS"); 	printf("(7)当你非常专心工作时，有人打断你，你会……\n"); 	printf("a)欢迎他\n"); 	printf("b)感到非常恼怒\n"); 	printf("c)在上两极端之间\n");  	char answer1; printf("你的选择是："); 	scanf("%c", &answer1); getchar(); 	if (answer1 == 'a'){ score += 6; } 	if (answer1 == 'b'){ score += 4; } 	if (answer1 == 'c'){ score += 2; } } void start8(){ 	system("CLS"); 	printf("(8)下列颜色中，你最喜欢哪一颜色?\n"); 	printf("a)红或橘色\n"); 	printf("b)黑色\n"); 	printf("c)黄或浅蓝色\n"); 	printf("d)绿色\n"); 	printf("e)深蓝或紫色\n"); 	printf("f)白色\n"); 	printf("g)棕或灰色\n"); 	char answer; printf("你的选择是："); 	scanf("%c", &answer); getchar(); 	if (answer == 'a'){ score += 6; } 	if (answer == 'b'){ score += 7; } 	if (answer == 'c'){ score += 5; } 	if (answer == 'd'){ score += 4; } 	if (answer == 'e'){ score += 3; } 	if (answer == 'f'){ score += 2; } 	if (answer == 'g'){ score += 1; } } void start9(){ 	system("CLS"); 	printf("(9)你经常梦到你在……\n"); 	printf("a)落下\n"); 	printf("b)打架或挣扎\n"); 	printf("c)找东西或人\n"); 	printf("d)飞或漂浮\n"); 	printf("e)你平常不做梦\n"); 	printf("f)你的梦都是愉快的\n");  	char answer; printf("你的选择是："); 	scanf("%c", &answer); getchar(); 	if (answer == 'a'){ score += 4; } 	if (answer == 'b'){ score += 2; } 	if (answer == 'c'){ score += 3; } 	if (answer == 'd'){ score += 5; } 	if (answer == 'e'){ score += 6; } 	if (answer == 'f'){ score += 1; } } void start10(){ 	system("CLS"); 	printf("(10)临入睡的前几分钟，你在床上的姿势是……\n"); 	printf("a)仰躺，伸直\n"); 	printf("b)俯躺，伸直\n"); 	printf("c)侧躺，微卷\n"); 	printf("d)头睡在一手臂上\n"); 	printf("e)被盖过头\n");  	char answer; printf("你的选择是："); 	scanf("%c", &answer); getchar(); 	if (answer == 'a'){ score += 7; } 	if (answer == 'b'){ score += 6; } 	if (answer == 'c'){ score += 4; } 	if (answer == 'd'){ score += 2; } 	if (answer == 'e'){ score += 1; }  } void add(PMember head){//添加新成员 	system("CLS"); 	score = 0; 	PMember m = NULL; PMember temp = NULL; 	if (NULL == head)return; 	m = (PMember)malloc(sizeof(Member)); 	printf("请输入你的个人信息：\n"); 	printf("学号："); scanf("%d", &m->id);	getchar(); 	printf("姓名："); scanf("%s", &m->name); getchar(); 	printf("性别："); scanf("%s", &m->sex); getchar(); 	m->pNext = NULL; 	for (temp = head; temp->pNext != NULL; temp = temp->pNext); 	temp->pNext = m; 	start1(); 	start2(); 	start3(); 	start4(); 	start5(); 	start6(); 	start7(); 	start8(); 	start9(); 	start10(); 	if (score <= 21){ 		printf("类型[A]\n"); m->type = 'A'; 		printf("  人们认为你是一个害羞的、神经质的、优柔寡断的，是须人照顾、永远要别人为你做决定、不想与任何事或任何人有关。他们认为你是一个杞人忧天者，一个永远看到不存在的问题的人。有些人认为你令人乏味，只有那些深知你的人知道你不是这样的人。\n"); 	} 	if (score>21 && score <= 30){ 		printf("类型[B]\n"); m->type = 'B'; 		printf("  你的朋友认为你勤勉刻苦、很挑剔。他们认为你是一个谨慎的、十分小心的人，一个缓慢而稳定辛勤工作的人。如果你做任何冲动的事或无准备的事，你会令他们大吃一惊。他们认为你会从各个角度仔细地检查一切之后仍经常决定不做。他们认为对你的这种反应一部分是因为你的小心的天性所引起的。\n"); 	} 	if (score >= 31 && score <= 40){ 		printf("类型[C]\n"); m->type = 'C'; 		printf("　别人认为你是一个明智、谨慎、注重实效的人。也认为你是一个伶俐、有天赋有才干且谦虚的人。你不会很快、很容易和人成为朋友，但是是一个对朋友非常忠诚的人，同时要求朋友对你也有忠诚的回报。那些真正有机会了解你的人会知道要动摇你对朋友的信任是很难的，但相等的，一旦这信任被破坏，会使你很难熬过。\n"); 	} 	if (score >= 41 && score <= 50){ 		printf("类型[D]\n"); m->type = 'D'; 		printf("  别人认为你是一个新鲜的、有活力的、有魅力的、好玩的、讲究实际的、而永远有趣的人;一个经常是群众注意力的焦点，但是你是一个足够平衡的人，不至於因此而昏了头。他们也认为你亲切、和蔼、体贴、能谅解人;一个永远会使人高兴起来并会帮助别人的人。\n"); 	} 	if (score >= 51 && score <= 60){ 		printf("类型[E]\n"); m->type = 'E'; 		printf("  别人认为你是一个令人兴奋的、高度活泼的、相当易冲动的个性;你是一个天生的领袖、一个做决定会很快的人，虽然你的决定不总是对的。他们认为你是大胆的和冒险的，会愿意试做任何事至少一次;是一个愿意尝试机会而欣赏冒险的人。因为你散发的刺激，他们喜欢跟你在一起。\n"); 	} 	if (score >= 60){ 		printf("类型[F]\n"); m->type = 'F'; 		printf("  别人认为对你必须“小心处理”。在别人的眼中，你是自负的、自我中心的、是个极端有支配欲、统治欲的。别人可能钦佩你，希望能多像你一点，但不会永远相信你，会对与你更深入的来往有所踌躇及犹豫.世界本来就是层层嵌套，周而复始;不以任何的意志而改变。\n"); 	}  } int main(void){ 	printf("这是一个简单的心理测试，请根据实际情况做出选择，希望这个测试可以给你帮助,解析仅供参考，多谢合作\n"); 	PMember head = NULL; 	head = createMember(); 	 	start1(); 	start2(); 	start3(); 	start4(); 	start5(); 	start6(); 	start7(); 	start8(); 	start9(); 	start10(); 	system("CLS"); 	int flag; 	printf("以下是测试的结果：\n"); 	if (score <= 21){ 		printf("类型[A]\n"); head->type = 'A'; 		printf("  人们认为你是一个害羞的、神经质的、优柔寡断的，是须人照顾、永远要别人为你做决定、不想与任何事或任何人有关。他们认为你是一个杞人忧天者，一个永远看到不存在的问题的人。有些人认为你令人乏味，只有那些深知你的人知道你不是这样的人。\n"); 	} 	if (score>21 && score <= 30){ 		printf("类型[B]\n"); head->type = 'B'; 		printf("  你的朋友认为你勤勉刻苦、很挑剔。他们认为你是一个谨慎的、十分小心的人，一个缓慢而稳定辛勤工作的人。如果你做任何冲动的事或无准备的事，你会令他们大吃一惊。他们认为你会从各个角度仔细地检查一切之后仍经常决定不做。他们认为对你的这种反应一部分是因为你的小心的天性所引起的。\n"); 	} 	if (score >= 31 && score <= 40){ 		printf("类型[C]\n"); head->type = 'C'; 		printf("　别人认为你是一个明智、谨慎、注重实效的人。也认为你是一个伶俐、有天赋有才干且谦虚的人。你不会很快、很容易和人成为朋友，但是是一个对朋友非常忠诚的人，同时要求朋友对你也有忠诚的回报。那些真正有机会了解你的人会知道要动摇你对朋友的信任是很难的，但相等的，一旦这信任被破坏，会使你很难熬过。\n"); 	} 	if (score >= 41 && score <= 50){ 		printf("类型[D]\n"); head->type = 'D'; 		printf("  别人认为你是一个新鲜的、有活力的、有魅力的、好玩的、讲究实际的、而永远有趣的人;一个经常是群众注意力的焦点，但是你是一个足够平衡的人，不至於因此而昏了头。他们也认为你亲切、和蔼、体贴、能谅解人;一个永远会使人高兴起来并会帮助别人的人。\n"); 	} 	if (score >= 51 && score <= 60){ 		printf("类型[E]\n"); head->type = 'E'; 		printf("  别人认为你是一个令人兴奋的、高度活泼的、相当易冲动的个性;你是一个天生的领袖、一个做决定会很快的人，虽然你的决定不总是对的。他们认为你是大胆的和冒险的，会愿意试做任何事至少一次;是一个愿意尝试机会而欣赏冒险的人。因为你散发的刺激，他们喜欢跟你在一起。\n"); 	} 	if (score >= 60){ 		printf("类型[F]\n"); head->type = 'F'; 		printf("  别人认为对你必须“小心处理”。在别人的眼中，你是自负的、自我中心的、是个极端有支配欲、统治欲的。别人可能钦佩你，希望能多像你一点，但不会永远相信你，会对与你更深入的来往有所踌躇及犹豫.世界本来就是层层嵌套，周而复始;不以任何的意志而改变。\n"); 	} 	printf("\n"); 	printf("\n"); 	printf("请继续操作\n"); 	printf("(0)退出系统\n"); 	printf("(1)添加新用户进行测试\n"); 	printf("(2)查看所有用户的信息\n"); 	scanf("%d", &flag); 	while (flag){ 		switch (flag) 		{ 		case 1:add(head); 		case 2:display(head); 		default:break; 		} 		printf("请继续操作\n"); 		printf("(0)退出系统\n"); 		printf("(1)添加新用户进行测试\n"); 		printf("(2)查看所有用户的信息\n"); 		scanf("%d", &flag); 	}   	return 0; }

user: user-0
content: 我检查过了，没有漏写getchar().而且只有第一次的score的值有问题，之后第二次测试结果就正确了，不知道为什么

user: user-3
content: 引用 3 楼 qq_36084484的回复:多谢啊，那个显示的问题解决了，但是我第一次的score结果不在范围是什么原因呢？不管怎么输入答案结果都是类型【A】；score的值变得很奇怪 检查你是否有些scanf后没有getchar，导致在start系列函数里接收到的是\n字符，故不匹配

user: user-0
content: 多谢啊，那个显示的问题解决了，但是我第一次的score结果不在范围是什么原因呢？不管怎么输入答案结果都是类型【A】；score的值变得很奇怪

user: user-3
content: 另外,add函数中：  printf("学号：");scanf("%d",&head->id); getchar(); 	printf("姓名：");scanf("%s",head->name);getchar(); 	printf("性别：");scanf("%s",head->sex);getchar();  这里的head是否应该要改成m，楼主仔细想下

user: user-3
content: createMember函数中：  printf("姓名：");scanf("%s",&head->name); printf("性别：");scanf("%s",&head->sex);  这两句中的&去掉，add函数中的也是