user-0 提问: 结构体无法赋值问题

回复:
user: user-0
content: 这里我输入了两班这个目的地的但是只出了一班，已输入编号就直接卡住了，也不知道怎么办好。 下午就要交作业了，要崩溃了，老师讲这里都没细讲都是自己学。都很懵

user: user-0
content: 引用 6 楼 自信男孩 的回复:[quote=引用 2 楼 wu5_chen 的回复:]那请问p0怎么初始化，我这些很多都是从老师给的那个例案抽出来了，然后这里又没学好  然后大佬能解释一下这段while(p0 && p0->next!=NULL&&strcmp(hb_city,p0->hb_city)!=0)是什么意思吗逻辑不是很懂为什么你要加p0&& 因为确保p0不为NULL，如果p0为NULL，主要是针对第一次循环而言的。[/quote] 现在我在订票那里卡住了他订票那不会显示出所有的订单，只有一条订单，然后一输入完乘坐航班编号就直接崩了

user: user-1
content: 引用 2 楼 wu5_chen 的回复:那请问p0怎么初始化，我这些很多都是从老师给的那个例案抽出来了，然后这里又没学好  然后大佬能解释一下这段while(p0 && p0->next!=NULL&&strcmp(hb_city,p0->hb_city)!=0)是什么意思吗逻辑不是很懂为什么你要加p0&& 因为确保p0不为NULL，如果p0为NULL，主要是针对第一次循环而言的。

user: user-2
content: typedef struct hangban {     char hb_num[20];     char hb_time[20];     char hb_city[20];     int hb_price;     int hb_discount;     int hb_seat;     struct hangban *next;//hangnban改为hangban     int n; }HB;

user: user-0
content: #include<stdio.h> #include <string.h> #include <stdlib.h> #include<conio.h> #define Max 100  typedef struct hangban { 	char hb_num[20]; 	char hb_time[20]; 	char hb_city[20]; 	int hb_price; 	int hb_discount; 	int hb_seat; 	struct hangnban *next; 	int n; }HB;  typedef struct kehu { 	char kh_name[20]; 	char kh_id[20]; 	char kh_plane_num[20]; 	char kh_plane_time[20]; 	int  kh_seat_num; 	struct kehu *next; }KH;  HB *p_hb; KH *p_kh; int n=0; void Wecome(); void Admin(); void Login(); int Menu(); void Menu_select(); void Init(); void New_flight(); void query(); void booking(); void refund_ticket(); void Save(); void Save_hb(); void Save_kh(); void Load(); void Load_hb(); void Load_kh();    void Wecome()  //登录界面 { 	system("cls"); 	printf("\n\n\n\t\t================================================\n"); 	printf("\t\t==                                            ==\n"); 	printf("\t\t==                                            ==\n"); 	printf("\t\t==            欢迎使用飞机订票系统:           ==\n"); 	printf("\t\t==      Welcome to the air booking system     ==\n"); 	printf("\t\t==                                            ==\n"); 	printf("\t\t==                                            ==\n"); 	printf("\t\t================================================\n"); 	printf("\t\t按任意键进入系统..........\n"); 	getch(); 	system("cls"); }  void Admin()  //管理员系统 { 	char yn[2]; 	printf("是否进入管理员系统?(Y/N):\n"); 	printf("Do you want to enter the administrator system?(Y/N):"); 	scanf("%s",yn); 	if((strcmp(yn,"Y")==0)||(strcmp(yn,"y")==0)) 	{ 		system("cls"); 		Login(); 	}else 	{ 		system("cls"); 		Menu(); 	} }  void Login()  //管理员登陆 { 	char admin[12],mima[12]; 	char yn[2];  	printf("管理员登录模块...\n"); 	printf("Administrator login module...\n"); 	printf("请输入管理员用户名:\n"); 	printf("Please enter the administrator user name:"); 	scanf("%s",admin); 	printf("请输入管理员密码:\n"); 	printf("Please enter the administrator password:"); 	scanf("%s",mima); 	if((strcmp(admin,"123"))==0&&(strcmp(mima,"123"))==0) 	{ 		printf("用户名密码正确!!!请按任意键继续...\n"); 		printf("User name and password are correct! Please press any key to continue\n"); 		getch(); 		system("cls"); 		New_flight(); 	} 	else 	{ 		printf("用户名密码错误!!!是否继续输入用户名密码(Y/N):\n"); 		printf("User name and password error! Do you want to continue to enter user name and password (Y / N):"); 		scanf("%s",yn); 		if((strcmp(yn,"Y")==0)||(strcmp(yn,"y")==0)) 		{ 			system("cls"); 			Login(); 		} 		else 		{ 			printf("请按任意键返回界面!!!"); 			printf("Please press any key to return to the interface!!!"); 			getch(); 			system("cls"); 			Wecome(); 			Menu(); 		} 	} }  void Init() //初始化 { 	HB *p; 	p=(HB *)malloc(sizeof(HB)); 	p_hb=p;  	printf("航班信息初始化开始\n"); 	printf("航班编号:\n"); 	scanf("%s",p->hb_num); 	printf("航班起降时间:\n"); 	scanf("%s",p->hb_time); 	printf("航班目的地城市:\n"); 	scanf("%s",p->hb_city); 	printf("机票价格:\n"); 	scanf("%d",&p->hb_price); 	printf("机票享受折扣:\n"); 	scanf("%d",&p->hb_discount); 	printf("航班座位数:\n"); 	scanf("%d",&p->hb_seat);   	p->next=NULL; 	p->n=++n; 	printf("\n航班信息初始化完成!!!请按任意键继续..."); 	getch(); 	system("cls"); }  int Menu()  //菜单 { 	int dm; 	printf("\n\n\n\t\t================================================\n"); 	printf("\t\t==                                            ==\n"); 	printf("\t\t==           1------录入                      ==\n"); 	printf("\t\t==           2------查询                      ==\n"); 	printf("\t\t==           3------订票                      ==\n"); 	printf("\t\t==           4------退票                      ==\n"); 	printf("\t\t==           5------退出                      ==\n"); 	printf("\t\t==                                            ==\n"); 	printf("\t\t================================================\n"); 	printf("请输入相应编号:"); 	for(;;) 	{  		scanf("%d",&dm); 		if(dm<1||dm>5) 		{ 			printf("\t\t编号错误!!!请重新输入:!!!"); 		} 		else 			break; 	} 	return dm;   }  void Menu_select()  //菜单选择 { 	for(;;) 	{ 		switch(Menu()) 		{ 		case 5: 			system("cls"); 			Save();	 			printf("\n\n\n\t\t================================================\n"); 			printf("\t\t==                                            ==\n"); 			printf("\t\t==              文件保存成功!!!               ==\n"); 			printf("\t\t==            欢迎下次使用本系统!!!           ==\n"); 			printf("\t\t==                                            ==\n"); 			printf("\t\t================================================\n"); 			getch(); 			exit(0); 		case 1:Admin();break; 		case 2:query();break; 		case 3:booking();break; 		//case 4:refund_ticket();break; 		default:printf("\n错误!!!"); 		 		exit(0); 		} 	} }  void New_flight() //录入新航班 { 	HB *p,*p0,*p1; 	p=p1=p_hb; 	printf("新航班录入模块...\n"); 	printf("请输入您要录入的新航班信息\n"); 	p0=(HB *)malloc(sizeof(HB));  S: 	printf("航班编号:\n"); 	scanf("%s",p0->hb_num); 	 	while(strcmp(p0->hb_num,p1->hb_num)!=0&&p1->next!=NULL) 		p1=p1->next;  	if(strcmp(p0->hb_num,p1->hb_num)==0) 	{ 		printf("该航班编号已存在!!!请重新输入:"); 		goto S; 		system("cls"); 	} 	else 	{ 		printf("航班起降时间:\n"); 		scanf("%s",p0->hb_time); 		printf("航班目的地城市:\n"); 		scanf("%s",p0->hb_city); 		printf("机票价格:\n"); 		scanf("%d",&p0->hb_price); 		printf("机票享受折扣:\n"); 		scanf("%d",&p0->hb_discount); 		printf("航班座位数:\n"); 		scanf("%d",&p0->hb_seat); 		 		while(p->next)  			p=p->next; 			 		if(p_hb==NULL)  			p_hb=p0;   /*此处分两种情况,链表中没有数据,head直接指向p0处*/ 			 		else  			p->next=p0; 	  		p0->next=NULL; 	    p0->n=++n; 	} 	printf("\n新航班已录入完毕!!!请按任意键继续..."); 	getch(); 	system("cls"); 	Wecome();  }  void query()  //查询 { 	HB *p; 	int i,x; 	char city[20],num[20]; 	p=p_hb;   	printf("\n\n\n\t\t======================================================\n"); 	printf("\t\t==            查询系统:                             ==\n"); 	printf("\t\t==           1------客户ID查询                      ==\n"); 	printf("\t\t==           2------目的地查询                      ==\n"); 	printf("\t\t==           3------返回界面                        ==\n"); 	printf("\t\t==                                                  ==\n"); 	printf("\t\t==                                                  ==\n"); 	printf("\t\t==                                                  ==\n"); 	printf("\t\t======================================================\n"); 	printf("请输入编号(1-3):"); 	scanf("%d",&x); 	switch(x) 	{ 	case 1:printf("请输入您的客户ID:"); 		scanf("%s",&num); 		printf("您输入客户ID已订票的航班如下:\n"); 	case 2:printf("请输入您的目的地:"); 	scanf("%s",&city); 	printf("您输入的目的地现有航班如下:\n"); 	printf("航班编号\t起降时间\t目的地城市\t机票价格\t机票折扣\t航班座位\n");  	for(i=0;i<p->n;i++) 	{ 		if(strcmp(city,p->hb_city)==0) 		{ 			printf("%s\t%s\t%s\t%d\t%d\t%d\n",p->hb_num,p->hb_time,p->hb_city,p->hb_price,p->hb_discount,p->hb_seat); 			p=p->next;  		} 	} 	printf("航班信息打印完毕!按任意键继续下一步操作..."); 	getch(); 	system("cls"); 	Menu(); 	case 3:getch(); 		system("cls"); 		Menu(); 	 	} }  void booking()  //订票 {     HB *p0; KH *p1,*p2,*p3;     int i;     char hb_city[20],hb_time[20];     p1=p3=p_kh;     p2=(KH *)malloc(sizeof(KH)); 	p0=p_hb;    I:     printf("订票系统...\n");     printf("请输入您的客户ID:\n");     scanf("%s",p2->kh_id);     //while(strcmp(p2->kh_id,p3->kh_id)!=0&&p3->next!=NULL)   //如果p3本身就是NULL怎么办？     while(p3 && strcmp(p2->kh_id,p3->kh_id)!=0&&p3->next!=NULL)   //如果p3本身就是NULL怎么办？         p3=p3->next;     if(p3 && strcmp(p2->kh_id,p3->kh_id)==0)     {         printf("该客户ID已存在!!!请勿进行多次订票");         goto I;         system("cls");     }         printf("请输入您的名字:\n");         scanf("%s",p2->kh_name);     printf("请输入您要前往的目的地:\n");     scanf("%s", hb_city);        while(p0 && p0->next!=NULL&&strcmp(hb_city,p0->hb_city)!=0)         p0=p0->next;     if(p0 && p0->next!=NULL&&(strcmp(hb_city,p0->hb_city)!=0))     {         printf("没有前往该目的地的航班!!!");         printf("请按任意键返回\n");     }else     {         printf("您输入的目的地现有航班如下:\n");         printf("航班编号\t起降时间\t目的地城市\t机票价格\t机票折扣\t航班座位\n");           for(i=0;i<p0->n;i++)         {             if(strcmp(p0->hb_city,hb_city)==0)             {                 printf("%s\t%s\t%s\t%d\t%d\t%d\n",p0->hb_num,p0->hb_time,p0->hb_city,p0->hb_price,p0->hb_discount,p0->hb_seat);                 p0=p0->next;             }         } 		printf("请输入您要乘坐的航班编号:"); 		scanf("%s",p2->kh_plane_num); 		while(p0 && p0->next!=NULL&&strcmp(p2->kh_plane_num,p0->hb_num)!=0) 			p0=p0->next;  		for(i=0;i<p0->n;i++) 		{ 			if(strcmp(p2->kh_plane_num,p0->hb_num)==0) 			{ 				strcpy(p2->kh_plane_num,p0->hb_num); 				strcpy(p2->kh_plane_time,p0->hb_time); 				p2->kh_seat_num++; 				 			} 		}     }   } void Save() { 	Save_hb(); 	Save_kh(); }  void Save_hb() { 	FILE *fh_hb; 	HB *t,*t0; 	t=p_hb; 	if((fh_hb=fopen("hangban.txt","wb"))==NULL) 	{ 		printf("\n文件保存失败!\n请重启本系统..."); 		exit(0); 	} 	while(t!=NULL) 	{ 		if(fwrite(t,sizeof(HB),1,fh_hb)!=1)  //写入文件 		{ 			printf("\n写入文件失败!\n请重启本系统...\n"); 			t0=t; 			t=t->next; 			free(t0);  //释放所有结点 		} 	} }  void Save_kh() { 	FILE *fh_kh; 	KH *t,*t0; 	t=p_kh; 	if((fh_kh=fopen("kehu.txt","wb"))==NULL) 	{ 		printf("\n文件保存失败!\n请重启本系统..."); 		exit(0); 	} 	while(t!=NULL) 	{ 		if(fwrite(t,sizeof(KH),1,fh_kh)!=1)  //写入文件 		{ 			printf("\n写入文件失败!\n请重启本系统...\n"); 			t0=t; 			t=t->next; 			free(t0); 		} 	} }  void Load() { 	Load_hb(); 	Load_kh(); }  void Load_hb() { 	HB *p1,*p2,*p3; 	FILE *fh; 	fh=fopen("hangban.txt","rb"); 	p1=(HB *)malloc(sizeof(HB)); 	fread(p1,sizeof(HB),1,fh); 	p_hb=p3=p2=p1; 	while(! feof(fh)) 	{ 		p1=(HB *)malloc(sizeof(HB)); 		fread(p1,sizeof(HB),1,fh); 		p2->next=p1; 		p3=p2; 		p2=p1; 	} 	p3->next=NULL; 	free(p1); 	fclose(fh);  //关闭文件 }  void Load_kh() { 	KH *p1,*p2,*p3; 	FILE *fh; 	fh=fopen("kehu.txt","rb"); 	p1=(HB *)malloc(sizeof(HB)); 	fread(p1,sizeof(HB),1,fh); 	p_kh=p3=p2=p1; 	while(! feof(fh)) 	{ 		p1=(KH *)malloc(sizeof(KH)); 		fread(p1,sizeof(KH),1,fh); 		p2->next=p1; 		p3=p2; 		p2=p1; 	} 	p3->next=NULL; 	free(p1); 	fclose(fh); }  int main() { 	FILE *fh_hb,*fh_kh; 	Wecome(); 	if((fh_hb=fopen("hangban.txt","rb"))==NULL||(fh_kh=fopen("kehu.txt","rb"))==NULL) 	{ 		Init(); 	}else 		Load();  	Menu_select(); }

user: user-0
content: 那请问p0怎么初始化，我这些很多都是从老师给的那个例案抽出来了，然后这里又没学好  然后大佬能解释一下这段while(p0 && p0->next!=NULL&&strcmp(hb_city,p0->hb_city)!=0)是什么意思吗逻辑不是很懂为什么你要加p0&&

user: user-1
content: typedef struct hangban {     char hb_num[20];     char hb_time[20];     char hb_city[20];     int hb_price;     int hb_discount;     int hb_seat;     //struct hb *next;     struct hangban *next;     int n; }HB;  typedef struct kehu {     char kh_name[20];     char kh_id[20];     char kh_plane_num[20];     char kh_plane_time[20];     int  kh_seat_num;     //struct kh *next;     struct kehu *next; }KH; 修改结构体定义  void booking()  //订票 {     HB *p0; KH *p1,*p2,*p3;     int i;     char hb_city[20],hb_time[20];     p1=p3=p_kh;     p2=(KH *)malloc(sizeof(KH));  I:     printf("订票系统...\n");     printf("请输入您的客户ID:\n");     scanf("%s",p2->kh_id);     //while(strcmp(p2->kh_id,p3->kh_id)!=0&&p3->next!=NULL)   //如果p3本身就是NULL怎么办？     while(p3 && strcmp(p2->kh_id,p3->kh_id)!=0&&p3->next!=NULL)   //如果p3本身就是NULL怎么办？         p3=p3->next;     if(p3 && strcmp(p2->kh_id,p3->kh_id)==0)     {         printf("该客户ID已存在!!!请勿进行多次订票");         goto I;         system("cls");     }     else     {         printf("请输入您的名字:\n");         scanf("%s",p1->kh_name);     }     printf("请输入您要前往的目的地:\n");     //scanf("%s",&hb_city);     scanf("%s", hb_city);     p0 = p_hb;   //需要初始化p0     //while(p0->next!=NULL&&strcmp(hb_city,p0->hb_city)!=0)   //p0没有初始化，是一个野指针     while(p0 && p0->next!=NULL&&strcmp(hb_city,p0->hb_city)!=0)   //p0没有初始化，是一个野指针         p0=p0->next;     if(p0 && p0->next!=NULL&&(strcmp(hb_city,p0->hb_city)!=0))     {         printf("没有前往该目的地的航班!!!");         printf("请按任意键返回\n");     }else     {         printf("您输入的目的地现有航班如下:\n");         printf("航班编号\t起降时间\t目的地城市\t机票价格\t机票折扣\t航班座位\n");          for(i=0;i<p0->n;i++)         {             if(strcmp(p0->hb_city,hb_city)==0)             {                 printf("%s\t%s\t%s\t%d\t%d\t%d\n",p0->hb_num,p0->hb_time,p0->hb_city,p0->hb_price,p0->hb_discount,p0->hb_seat);                 p0=p0->next;             }         }     }  }  函数的修改  供参考～