user-0 提问: 学过c的进来看看，小弟有一个问题，帮忙看看

回复:
user: user-1
content: 引用 45 楼 _ZGq 的回复:[quote=引用 44 楼 赵4老师 的回复:] [quote=引用 43 楼 _ZGq 的回复:] scanf里%s后面加&和不加&的区别我知道，只是在结果上有什么不同？在我的机器上没有不同。估计是scanf对%s后面加&和不加&都做了处理，一个对应一级指针，一个对应二级指针，两种方法都有效。是这样吗？ 只有对char[]类型的变量才有效。[/quote] 是输入char[]类型加不加&都一样吗？[/quote] 对

user: user-2
content: 引用 44 楼 赵4老师 的回复:[quote=引用 43 楼 _ZGq 的回复:] scanf里%s后面加&和不加&的区别我知道，只是在结果上有什么不同？在我的机器上没有不同。估计是scanf对%s后面加&和不加&都做了处理，一个对应一级指针，一个对应二级指针，两种方法都有效。是这样吗？ 只有对char[]类型的变量才有效。[/quote] 是输入char[]类型加不加&都一样吗？

user: user-1
content: 引用 43 楼 _ZGq 的回复:scanf里%s后面加&和不加&的区别我知道，只是在结果上有什么不同？在我的机器上没有不同。估计是scanf对%s后面加&和不加&都做了处理，一个对应一级指针，一个对应二级指针，两种方法都有效。是这样吗？ 只有对char[]类型的变量才有效。

user: user-2
content: scanf里%s后面加&和不加&的区别我知道，只是在结果上有什么不同？在我的机器上没有不同。估计是scanf对%s后面加&和不加&都做了处理，一个对应一级指针，一个对应二级指针，两种方法都有效。是这样吗？

user: user-3
content: 加&和不加&有什么不同 &是取地址，char c  时 取地址 就是 &c char jx[2]; 时 取地址 就是 jx。 因为 数组 名 就是 数组开始的 地址 。

user: user-1
content: 数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

user: user-1
content: 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 char c; scanf("%c",&c); //时，都改为 char s[2]; char c; scanf("%1s",s); c=s[0]; //自动跳过一个或多个空格或Tab字符或回车换行，读取下一个字符。

user: user-4
content: 大佬，能不能帮我解决一个跟这个题目很像的题目，谢谢

user: user-5
content: 写的不错。。。。

user: user-6
content: 学习了。。。

user: user-7
content: 除了调试用，其他情况尽量少用 gets ,scanf, puts这些乱起八糟的。

user: user-2
content: 引用 34 楼 schlafenhamster 的回复:printf("真的要删除该结点吗？(y/n)"); 		scanf("%c",&jx);  jx=0x0a !!!!   void delnode(linklist head) { 	char jx[2]; 	listnode *p,*q; 	p=listfind(head); //调用查找函数 	if(p==NULL) 	{ 		printf("没有查到要删除的通讯者！\n"); 		return; 	} 	else 	{ 		printf("真的要删除该结点吗？(y/n)"); 		scanf("%s",jx); 		if(jx[0]=='y'||jx[0]=='Y') 		{ 			q=head; 			while(q!=NULL && q->next!=p) q=q->next; 			q->next=p->next;                                                          //删除结点 			free(p);           //释放被删除的结点空间 			printf("通讯者已被删除！\n"); 		} 		else 		{ 			printf("通讯者被保留！\n"); 		} 	} }   注意 scanf("%c",&jx); 与 scanf("%s",jx); 的不同 我一直就不明白%s后面加&和不加&有什么不同？虽然我知道一个是一级指针一个是二级指针，但在结果方面有什么不同？

user: user-8
content: 看到评论，也能学到好多东西

user: user-9
content: 引用 19 楼 赖卓成 的回复：[quote=引用 14 楼 @风轻云淡_的回复:]puts输出的时候回自带回车换行 那要怎么让他不换行呢[/quote]小老弟，你字符串输入输出还有问题啊，你都能学到这里了不清楚字符串有点难以理解

user: user-9
content: 初始化真的很重要，尤其在循环里。。。。

user: user-3
content: printf("真的要删除该结点吗？(y/n)"); 		scanf("%c",&jx);  jx=0x0a !!!!   void delnode(linklist head) { 	char jx[2]; 	listnode *p,*q; 	p=listfind(head); //调用查找函数 	if(p==NULL) 	{ 		printf("没有查到要删除的通讯者！\n"); 		return; 	} 	else 	{ 		printf("真的要删除该结点吗？(y/n)"); 		scanf("%s",jx); 		if(jx[0]=='y'||jx[0]=='Y') 		{ 			q=head; 			while(q!=NULL && q->next!=p) q=q->next; 			q->next=p->next;                                                          //删除结点 			free(p);           //释放被删除的结点空间 			printf("通讯者已被删除！\n"); 		} 		else 		{ 			printf("通讯者被保留！\n"); 		} 	} }   注意 scanf("%c",&jx); 与 scanf("%s",jx); 的不同

user: user-10
content: 大佬可以帮我改一下错误不?

user: user-11
content: 感觉看着都头疼

user: user-12
content: 引用 20 楼 听、的回复:#include<stdio.h> #include<string.h> #include<stdlib.h> typedef struct{                                                                //通讯录结点类型 char num[5];                                                                      //编号 char name[9];                                                                      //姓名 char sex[3];                                                                      //性别 char phone[13];                                                                    //电话 char addr[31];                                                                    //地址 }datatype; typedef struct node{                                                            //结点类型定义 datatype data;                                                              //结点数据域 struct node*next;                                                            //结点指针域 }listnode; typedef listnode*linklist; linklist head; listnode *p; //函数说明 int menu_select(); linklist createlist(void); void insertnode(linklist head,listnode *p); listnode *listfind(linklist head); void delnode(linklist head); void printlist(linklist head); //主函数 void main() { for( ; ; ){ switch(menu_select()) { case 1: printf("***************************\n"); printf("*    通讯录链表的建立    *\n"); printf("****************************\n"); head=createlist(); break; case 2: printf("***************************\n"); printf("*    通讯者信息的添加    *\n"); printf("******************************************\n"); printf("编号(4) 姓名(8) 性别 电话(11) 地址(31)\n"); printf("*******************************************\n"); p=(listnode *)malloc(sizeof(listnode)); scanf("%s%s%s%s%s",p->data.num,p->data.name,p->data.sex,p->data.phone,p->data.addr); insertnode(head,p); break; case 3: printf("*************************************\n"); printf("*        通讯录信息的查询          *\n"); printf("***************************************\n"); p=listfind(head); if(p!=NULL){ printf("编号 姓  名  性别  联系电话  地  址\n"); printf("----------------------------------------------------------------------------------\n"); printf("%s,%s,%s,%s,%s\n",p->data.num,p->data.name,p->data.sex,p->data.phone,p->data.addr); printf("----------------------------------------------------------------------------------\n"); } else printf("没查到要查询的通讯者！\n"); break; case 4: printf("************************************\n"); printf("*        通讯录信息的删除        *\n"); printf("*************************************\n"); delnode(head); break; case 5: printf("************************************\n"); printf("*        通讯录链表的输出          *\n"); printf("*************************************\n"); printlist(head); break; case 0: printf("\t 再    见！\n"); return; } } } /*********************/ /*菜单选择函数程序 */ /*******************/ int menu_select() { int sn; printf("      通讯录管理系统\n"); printf("============================\n"); printf("      1.通讯录链表的建立\n"); printf("      2.通讯录结点的插入\n"); printf("      3.通讯录结点的查询\n"); printf("      4.通讯录结点的删除\n"); printf("      5.通讯录链表的输出\n"); printf("      0.退出管理系统\n"); printf("============================\n"); printf("    请选择0-5:  "); for( ; ; ) { scanf("%d",&sn); if(sn<0 || sn>5) printf("\n\t输入错误，重选0-5: "); else break; } return sn; } /******************************/ /*用尾插法建立通讯录链表函数*/ /*****************************/ linklist createlist(void) {                                                      //尾插法建立带头结点通讯录链表算法 linklist head=(listnode *)malloc(sizeof(listnode)); listnode *p,*rear; int flag=0;                                                                //结束标志置0 rear=head;                                                      //尾指针初始指向头结点 while(flag==0) { p=(listnode *)malloc(sizeof(listnode));                                        //申请新结点 printf("编号(4) 姓名(8) 性别 电话(11)  地址(31)\n"); printf("----------------------------------------------------------------\n"); scanf("%s%s%s%s%s",p->data.num,p->data.name,p->data.sex,p->data.phone,p->data.addr); rear->next=p;                                                //新结点连接到尾结点之后 rear=p;                                                            //尾指针指向新结点 printf("结束建表吗？ (1/0):"); scanf("%d",&flag);                                                  //读入一个标志数据 } rear->next=NULL;                                                  //终端结点指针域置空 return head;                                                            //返回链表头指针 } void insertnode(linklist head,listnode *p) { listnode *p1,*p2; p1=head; p2=p1->next; while(p2!=NULL && strcmp(p2->data.num,p->data.num)<0) { p1=p2;                                                      //p1指向刚访问过的结点 p2=p2->next;                                                //p2指向表的下一个结点 } p1->next=p;                                                        //插入p所指向的结点 p->next=p2;                                                          //连接表中剩余部分 } listnode *listfind(linklist head) { listnode *p; char num[5]; char name[9]; int xz; printf("=====================\n"); printf("1.按编号查询        \n"); printf("2.按姓名查询        \n"); printf("=====================\n"); printf("      请选择:  "); p=head->next;                                                    //假定通讯录表带头结点 scanf("%d",&xz); if(xz==1){ printf("请输入要查找者的编号: "); scanf("%s",num); while(p && strcmp(p->data.num,num)<0) p=p->next; if(p==NULL || strcmp(p->data.num,num)>0) p=NULL;                                              //没有查到要查找的通讯者 } else if(xz==2){ printf("请输入要查找者的姓名："); scanf("%s",name); while(p && strcmp(p->data.name,name)!=0) p=p->next; } return p; } void delnode(linklist head) { char jx; listnode *p,*q; p=listfind(head);                                                            //调用查找函数 if(p==NULL){ printf("没有查到要删除的通讯者！\n"); return; } printf("真的要删除该结点吗？(y/n)"); scanf("%c",&jx); if(jx=='y'||jx=='Y'){ q=head; while(q!=NULL && q->next!=p) q=q->next; q->next=p->next;                                                          //删除结点 free(p);                                                      //释放被删除的结点空间 printf("通讯者已被删除！\n"); } } void printlist(linklist head) { listnode *p; p=head->next;                                  //因为链表带头接点，使P指向链表开始结点 printf("编号 姓  名  姓别  联系电话    地  址\n"); printf("-----------------------------------------------------------------------\n"); while(p!=NULL) { printf("%s,%s,%s,%s,%s\n",p->data.num,p->data.name,p->data.sex,p->data.phone,p->data.addr); printf("-------------------------------------------------------\n"); p=p->next; } }有没有大佬帮忙解决一下这个程序删除结点时不管输入y或n都回到选择模块无限循环显示输入有误的问题 你的缓存区里应该还有东西，最好fflush一下

user: user-1
content: 不要依赖调试器输出复杂数据结构！而要将复杂数据结构的整个内容在处理它的每一步使用一小段代码按自己很容易理解的格式输出，非常有助于调试！或者可以说是“基础设施” 数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633