链表求和,先删除数据再求和

删除单链表奇数节点,并求和
将数据带进去都是对的,可是就是说运行错误。是漏了哪一个环节


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

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

struct ListNode *createfromtail();
struct ListNode *deleteodd( struct ListNode *head );
int  addlist( struct ListNode *head );


int main()
{
    struct ListNode *head;
    int sum;
    head = createfromtail();
    head = deleteodd(head);
    sum=addlist(head);
    printf("%d\n",sum);
    return 0;
}

struct ListNode *createfromtail()
{
   struct ListNode *head=NULL,*p,*q;
   int i,s;

   while(1)
   {
        scanf("%d",&s);
        if(s==-1)  break;
        p=(struct ListNode *)malloc(sizeof(struct ListNode));
        p->data=s;
        p->next=NULL;

        if(head==NULL)
        {
           head=p;
           q=p;
        }
        else
        {
               q->next=p;
               q=p;
        }
   }
   return head;
}

int  addlist( struct ListNode *head )
{
   struct ListNode * p=head;
   int sum=0;   
   while(p!=NULL)
   {
      sum=sum+p->data;
      p=p->next;
   }
   return sum;
}

struct ListNode *deleteodd( struct ListNode *head ){
    struct ListNode*p,*q;
    p = head;
    q = p;
    int i;
    i = 1;
    while(p){
        if((p->data%2==1||p->data%2==-1)&&i==1){
            head = head->next;
            p = head;
            q = p;
        }
        if((p->data%2==1||p->data%2==-1)&&i!=1){
            if(p->next==NULL){
                p->data=0;
            
                break;
            }
            q->next = p->next;
                p = p->next;
        }
        if(p->data%2==0||p->data==0){
        
        q = p;
        p = p->next;
        i = 2;}
        
    }
     return head;
}



```

删除单链表奇数节点,是结点位置为奇数还是结点的数据域值为奇数?

输入值中有-1将终止输入,后面的输入无效。
删除的节点没有free