PTA 实验11-2-4 删除单链表偶数节点 (20 分)

PTA 实验11-2-4 删除单链表偶数节点 (20 分)
本题要求实现两个函数,分别将读入的数据存储为单链表、将链表中偶数值的结点删除。链表结点定义如下:

struct ListNode {
    
    
    int data;
    struct ListNode *next;
};

函数接口定义:

struct ListNode *createlist();
struct ListNode *deleteeven( struct ListNode *head );

函数createlist从标准输入读入一系列正整数,按照读入顺序建立单链表。当读到−1时表示输入结束,函数应返回指向单链表头结点的指针。
函数deleteeven将单链表head中偶数值的结点删除,返回结果链表的头指针。

裁判测试程序样例:

#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;
}
/* 你的代码将被嵌在这里 */

输入样例:

1 2 2 3 4 5 6 7 -1

输出样例:

1 3 5 7 
struct ListNode *createlist()
{
    
    
    int number;
    struct ListNode *p,*head,*tail=head=NULL;
    scanf("%d",&number);
    while(number!=-1){
    
    
        p=(struct ListNode *)malloc(sizeof(struct ListNode ));
        p->data=number;
        if(head==NULL) head=p;
        else tail->next=p;
        tail=p;
        tail->next=NULL;//别忘了这一句
        scanf("%d",&number);
    }
return head;
}

struct ListNode *deleteeven( struct ListNode *head )
{
    
    
    struct ListNode *p,*tail;
    while(head&&head->data%2==0){
    
    
        p=head;
        head=head->next;
        free(p);
    }
    if(head==NULL) return NULL;
    p=head;
    tail=head->next;
    while(tail){
    
    
        if(tail->data%2==0){
    
    
            p->next=tail->next;
            free(tail);
        }else p=tail;
        tail=p->next;
    }
    return head;
}

猜你喜欢

转载自blog.csdn.net/qq_53749266/article/details/115089836