一道关于c语言链表的问题

请问哪位可以解答一下这个问题。

【问题描述】
输入n(n>1)个正整数,每次将输入的整数插入链表的头部。-1表示输入结束。再输入一个正整数,在链表中查找该数据并删除对应的结点。要求输出删除结点后链表所有结点中的数据。
【输入形式】
输入以空格分隔的n个整数,以-1结束输入,再输入一个要删除的整数。
【输出形式】
从链表第一个结点开始,输出链表所有结点中的数据,以空格分隔。
【样例输入】
2 4 6 7 8 4 -1
2
【样例输出】
4 8 7 6 4
【样例说明】
输入以空格分隔的n个整数2 4 6 7 8 4,以-1结束输入,然后输入2,删除2之后,输出剩余整数。

#include
#include
#define LEN sizeof(struct list)

struct list {

int num;

struct list *next;

};

int n;

struct list *create(void) {

struct list *head;

struct list *p1,*p2;

n=0;

p1=p2= (1) ;

scanf("%d",&p1->num);

head=NULL;

while (p1->num!=-1) {

   n++;

   if (n == 1)

       head=p1;

  else2)      ;

  p2=p1;

  p1=(struct list *)malloc(LEN);

  scanf("%d",&p1->num);

}

p2->next=NULL;

return head;

}

struct list *delnode(struct list *h,int x) {

struct list *head,*p,*q;

head=(struct list *)malloc(LEN);

head->next=h;

p=head->next;

q=head;

while (p!=NULL) {

   if (p->num == x) {

                (3;

       free(p);

       p=q->next;

   }

   else {

       q=p;

       p=p->next;

   }

}

q=head;

head=head->next;

4;

return head;

}

void print(struct list *head) {

int tmp[20];

int i,j;

struct list *p;

p=head;

if (head != NULL)

{

   i = 0;

   while (p != NULL){

       tmp[i++] = p->num;

       p = p->next;

    }

   for (j=i-1;j>=0;j--)

           printf("%d ",tmp[j]);

}

}

int main() {

struct list *head;

int x;

head= (5) ;

scanf("%d",&x);

head=delnode(head,x);

print(head);

return 0;

}

修改如下,供参考:

#include <stdio.h>
#include <malloc.h>
#define LEN sizeof(struct list)
struct list {

    int    num;
    struct list* next;
};

int n;

struct list* create(void) {

    struct list* head;
    struct list* p1, * p2;
    n = 0;
    p1 = p2 = (struct list*)malloc(LEN); //(1);
    scanf("%d", &p1->num);
    head = NULL;
    while (p1->num != -1) {

        n++;
        if (n == 1)
            head = p1;
        else
            p2->next = p1; //(2);
        p2 = p1;
        p1 = (struct list*)malloc(LEN);
        scanf("%d", &p1->num);
    }
    p2->next = NULL;
    return head;

}

struct list* delnode(struct list* h, int x) {

    struct list* head, * p, * q;
    head = (struct list*)malloc(LEN);
    head->next = h;
    p = head->next;
    q = head;
    while (p != NULL) {

        if (p->num == x) {
            q->next = p->next;//(3);
            free(p);
            p = q->next;
        }
        else {
            q = p;
            p = p->next;
        }
    }
    q = head;
    head = head->next;
    free(q);  //(4);
    return head;
}

void print(struct list* head) {

    int tmp[20];
    int i, j;
    struct list* p;
    p = head;
    if (head != NULL)
    {
        i = 0;
        while (p != NULL) {
            tmp[i++] = p->num;
            p = p->next;
        }
        for (j = i - 1; j >= 0; j--)
            printf("%d ", tmp[j]);
    }
}

int main() {
    struct list* head;
    int x;
    head = create(); //(5);
    scanf("%d", &x);
    head = delnode(head, x);
    print(head);
    return 0;
}