回复 9楼 linlulu001
还是不会编写删除多个结构体的语句啊,自己编的每次循环都只能删除一个结构体,好悲哀!
[此贴子已经被作者于2016-9-12 18:10编辑过]
struct student *del(struct student *head,int num) { struct student *p1,*p2; if(head==NULL) { printf("\nThis list is null!\n"); goto END; } p1=head; //为什么这里是p1指向head而不是head指向p1 ,因为要给p1初始化, while(p1->num!=num && p1->next!=NULL) //当p1为空或者p1->num==num跳出循环 { p2=p1; // p1=p1->next; // } if(p1->num==num)//如果当前p1->num==num,执行删除。所以楼主的代码逻辑就是只找到一个符合条件的元素删除了就完了。如果程序存在多个要删除的元素就不行了 { if(p1==head) { head=p1->next; } else { p2->next=p1->next; } printf("\nDeleat NO:%d succesed!\n",num); n=n-1; } else { printf("%d not been found!\n",num); } END: return(head); }解决方法有很多,这里我修改楼主的部分代码实现如下。
struct student *del(struct student *head,int num) { struct student *p1;// struct student *p2;//专门用来free() int Times=0;//用来统计被删除的元素个数 if(head==NULL) { printf("\nThis list is null!\n"); return NULL;//没必要非得用GOTO,直接return就行了。写多个return语句的程序看起来比GOTO的健壮得多 } p1=head; //为什么这里是p1指向head而不是head指向p1 ,因为要给p1初始化, while( p1->num==num){p2=p1;p1=p1->next;free(p2);Times++;} //处理删除链表头部 的问题 head=p1;//此时p1->num肯定不会等于num if(p1) //如果p1为空,跳过下面的循环,主要还是为了避免p1==NULL时,访问p1->next导致程序异常终止 while(p1->next!=NULL){ if(p1->next->num==num){p2=p1->next;p1->next=p2->next;free(p2);Times++;} p1=p1->next; } if(Times)printf("\nDeleat NO:%d succesed!\n",num); else printf("%d not been found!\n",num); return head ;//搞不懂你为什么要加括号 }
[此贴子已经被作者于2016-9-12 21:41编辑过]