题目如下:
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
struct ListNode {
int data;
struct ListNode *next;
};
struct ListNode *createlist();
struct ListNode *deleteeven( struct ListNode *head );
void printlist( struct ListNode *head )
{
struct ListNode *p = head;
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main()
{
struct ListNode *head;
head = createlist();
head = deleteeven(head);
printlist(head);
return 0;
}
/* 你的代码将被嵌在这里 */
代码如下:
struct ListNode *createlist()
{
struct ListNode* head = (struct ListNode*)malloc(sizeof(struct ListNode));
head = NULL;//初始化头指针为NULL
//p作为一个临时结点存储新创建结点的地址,pr用作在链表中移动的指针
struct ListNode *p, *pr;
pr = head;
int n;
scanf("%d",&n);
while(n!=-1)
{
//为新结点分配内存空间
p = (struct ListNode*)malloc(sizeof(struct ListNode));
p->data = n;
//若链表未进行初始化,将头指针head和pr指向新创建的分析结点
if(head == NULL)
{
head = p;
pr = p;
}
//若已经初始化(至少存在一个结点),将结点p插入链表的尾部,并更新pr指向新插入的结点p
else{
pr->next = p;
pr = p;//将pr指针移动到链表的尾部
}
scanf("%d",&n);//继续读取下一个数据
}
p->next = NULL;//明确表示链表的结束
return head;
}
struct ListNode *deleteeven( struct ListNode *head )
{
struct ListNode *p, *pr;
//删除偶数结点
//如果链表的头结点不为空并且头结点的值为偶数
while(head && head->data%2==0)
{
pr = head;
head = head->next;
free(pr);
}
//经过第一步操作,头结点及其后面的所有连续的偶数节点都已经被删除了
//用pr指针遍历链表,删除其余包含偶数值的结点
pr = head;
while(pr&&pr->next!=NULL)//pr->next!=NULL保证我们没有超出链表的有效范围
{
while(pr->next&&pr->next->data%2==0)//检查当前结点指向的下一个结点是否为偶数
{
p = pr->next;//将p指向当前的偶数结点
pr->next = p->next;
free(p);
}
pr = pr->next;//继续向下遍历
}
return head;
}