将链表1中学号值为偶数的结点放到新链表2中,链表1只保留学号值为奇数的结点

#include <stdio.h>
#include <stdlib.h>
typedef struct Student{
int num;
struct Student p;
}stu;
stu
jl()
{
stu *head,end,node;
int n,i;
end=head=(stu
)malloc(sizeof(stu));
printf("链表\n");
printf("输入个数:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
node=(stu*)malloc(sizeof(stu));
printf("输入学号:");
scanf("%d",&node->num);
head->p=node;
head=head->p;
}
node->p=NULL;
return end;
}
void output(stu
o)
{
while(o->p!=NULL)
{
printf("%d ",o->p->num);
o=o->p;
}
}
int main()
{
stu *k1,*lk2,*k3,*lk4,p_q;
stu temp;
int o=0;
lk2=(stu
)malloc(sizeof(stu));
lk4=lk2;
k1=jl();
k3=k1;
while(k1->p!=NULL)
{
p_q=k1;
if(k1->p->num%2==0)
{
temp=k1->p;
p_q->p=p_q->p->p;
lk2->p=(stu
)malloc(sizeof(stu));
lk2->p->num=temp->num;
printf("找到:%d\n",lk2->p->num);
free(temp);
lk2=lk2->p;
o++;
}
else
k1=k1->p;
}
printf("申请了%d个新结点\n",o);
printf("k3:");
output(k3);
printf("\nlk4:");
output(lk4);
return 0;
}

img


申请了两个新的结点,但输出时有四个学号。

一些小的逻辑错误把,lk4用于记录存放偶数节点的起始节点,lk2用于插入偶数节点,修改了一下,如下:


#include <stdio.h>
#include <stdlib.h>

typedef struct Student{
int num;
struct Student *p;
}stu;

stu* jl()
{
    stu *head,*end,*node;
    int n,i;
    end=head=(stu*)malloc(sizeof(stu));
    printf("链表\n");
    printf("输入个数:");
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {

        printf("输入学号:");
        scanf("%d",&head->num);
        node=(stu*)malloc(sizeof(stu));
        head->p=node;
        head=head->p;
    }
    head->p=NULL;
    return end;
    
}    
void output(stu* o)
{
    while(o->p!=NULL)
    {
        printf("%d ",o->num);
        o=o->p;
    }
}

int main()
    {
    stu *k1,*lk2,*k3,*lk4,*p_q;
    stu * temp;
    int o=0;
    
    lk2=(stu*)malloc(sizeof(stu));
    lk4=lk2;  //lk4用于存放新节点的起始节点,lk2用于插入偶数节点 
    
    k1=jl();
    
    k3=k1;
    while(k1->p!=NULL)
    {
    //    p_q=k1;
        if(k1->num%2==0)
        {
        //    temp=k1->p;
            lk2->num=k1->num;
            lk2->p = (stu*)malloc(sizeof(stu));
            lk2=lk2->p;

//            p_q->p=p_q->p->p;
//            lk2->p=(stu*)malloc(sizeof(stu));
//            lk2->p->num=temp->num;
//            printf("找到:%d\n",lk2->p->num);
//            free(temp);
//            lk2=lk2->p;
//            o++;
        }
    
        k1=k1->p;
    }
    lk2->p=NULL;
    
    output(lk4); 
//    printf("申请了%d个新结点\n",o);
//    printf("k3:");
//    output(k3);
    
//    printf("\nlk4:");
    //output(lk4);
    
    return 0;
}

你的代码是漏了很多吗?很多地方有问题啊。