这是我代码出现问题的地方(蓝条处):请大家帮忙看看怎么解决问题。不太懂链表。谢谢!
代码
```c
struct ListNode *readlist(){
struct ListNode *head=NULL,*q,*p;
int number;
while( 1){
scanf("%d",&number);
if(number==-1){
break;
}
q=(struct ListNode*)malloc(sizeof(struct ListNode));
q->data=number;
q->next=NULL;
if(head!=NULL){
p->next=q;
}else{
head=q;
}
p=q;
}
//printlist(head);
return head;
}
struct ListNode *getodd( struct ListNode **L ){
struct ListNode *head=NULL,*head2=NULL,*p=*L,*tail=NULL,*tail2=NULL;
while(p!=NULL){//不能是p->next!=NULL不然最后一个结点会不执行;
if(p->data%2!=0){
if(head==NULL){
head=p;
}else{
tail->next=p;
}
tail=p;
}else{
if(head2==NULL){
head2=p;
}else{
tail2->next=p;
}
tail2=p;
}
p=p->next;
}
tail->next=NULL;
tail2->next=NULL;
*L=head2;
return head;
}
```
修改如下,改动处见注释,供参考:
struct ListNode *readlist(){
struct ListNode *head=NULL,*q,*p;
int number;
while( 1){
scanf("%d",&number);
if(number == -1){
break;
}
q=(struct ListNode*)malloc(sizeof(struct ListNode));
q->data=number;
q->next=NULL;
if(head!=NULL){
p->next=q;
}else{
head=q;
}
p=q;
}
//printlist(head);
return head;
}
struct ListNode *getodd( struct ListNode **L ){
struct ListNode *head=NULL,*head2=NULL,*p=*L,*tail=NULL,*tail2=NULL;
while(p!=NULL){//不能是p->next!=NULL不然最后一个结点会不执行;
if(p->data%2!=0){
if(head==NULL){
head = p;
}else{
tail->next=p;
}
tail=p;
}else{
if(head2==NULL){
head2 = p;
}else{
tail2->next=p;
}
tail2=p;
}
p=p->next;
if (tail) tail->next=NULL; // 修改
if (tail2) tail2->next=NULL; // 修改
}//修改
*L = head2;
return head;
}
我们要判断素数,首先要知道素数的定义。
素数:质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数。
知道了素数的定义,那么我们应该想一下,如何去判断一个数是否为素数?
一种思路是,我们在每次得到一个数后,都去计算,去尝试因式分解它,看它除了1和自身之外还有没有其他因子
另一种是,我们去查阅素数表,看这个数在不在素数表上。那我们就要先得到素数表。
以下除了第一种方法,第2~4种方法都是用第二种思路做的
当要判断的目标数很少时,第一种高效。但是当给定的目标数组很多,数也很大时。后面的思路配上高效的查找算法,显然更高效