删除单链表偶数节点 (20分)

删除单链表偶数节点 (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 

思路
本题和前边的差不多
需要注意的是创建链表可以创建成带头结点的也对,
但是返回的时候记得要返回第一个结点(根据看int main 中的程序决定出来的)(不带头结点也对只要返回第一个数的指针即可)
删除也是因为 int main中给传入的head指的是第一个结点所以要分为在头删还是在中间删

struct ListNode *createlist(){
//带有头结点的做法头结点head要先开辟空间,头结点它是有空间的不是仅有一个单纯的指针
 struct ListNode *head=(struct ListNode *)malloc(sizeof(struct ListNode));
 struct ListNode *tail;
 tail=head;
 //struct ListNode *head,*tail;@1
//head=tail=NULL;@2
//@1和@2的写法是不对的那是不带头结点的写法
int Data;
while(scanf("%d",&Data)&&Data!=-1){
struct ListNode *p=(struct ListNode *)malloc(sizeof(struct ListNode));
p->data=Data;
//tail->next指的就是第一个数直接在tail->next那里存数就行不用分在头插还是在中间插
tail->next=p;
tail=p;
}
//看测试程序void printlist( struct ListNode *head )中 struct ListNode *p = head; printf("%d ", p->data);
//说明它是从第一个元素开始输出的所以返回的是第一个元素的指针head->next而不是head
return head->next;
}
//上边的做法和下边的做法都对
/*struct ListNode *createlist(){
struct ListNode *head,*tail;
head=tail=NULL;
int Data;
while(scanf("%d",&Data)&&Data!=-1){
struct ListNode *p=(struct ListNode *)malloc(sizeof(struct ListNode));
p->data=Data;
if(head==NULL){
        head=tail=p;
    }
    else{
        tail->next=p;
        tail=p;
    }
}
return head;
}
*/


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


版权声明:本文为weixin_44044816原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。