#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *next;
}NODE;
NODE *create(int n); //用头插法建链表,n是结点的个数,值从键盘输入
void print(NODE *h) ;
NODE *delOdd(NODE *h); //删除值为奇数的结点
int main( )
{
NODE *head;
int n;
scanf("%d",&n); //输入个数
head = create(n);
print(head);
head=delOdd(head);
print(head);
return 0;
}
void print(NODE *h) //遍历链表并输出
{
if(h==NULL){
printf("NULL");
return;
}
while(h!=NULL){
printf("%3d",h->data);
h=h->next;
}
printf("\n");
}
// 请在此添加代码
NODE *create(int n)//头插法建立链表
{
NODE *h=NULL,*p;
int i;
int data;
for(i=0;i<n;i++)
{
scanf("%d",&data);
p=(NODE*)malloc(sizeof(NODE));
p->data=data;
p->next=h;
h=p;
}
return h;
}
NODE *delOdd(NODE *h)//删除值为奇数的结点
{
NODE *p,*q,*s;
while(h!=NULL && h->data%2==1)//先判断第一个结点
{
q=h;
h=h->next;
free(q);
}
p=h;//p为链表第二个元素
for(p;p!=NULL;p=p->next)//p遍历整个链表,p不等于空时,p指向下一个节点
{
s=p;//s指向要删除结点的前一个
for(q=p->next;q!=NULL;)
{
if(q->data%2!=0)//若q为奇数
{
s->next=q->next;//s直接指向q下一个结点
free(q);
q=s->next;
}
else
{
s=q;//s指向下一个结点q
q=q->next;
}
}
}
return h;
}
04-07
2185
03-15
685
06-12