链表:删除指定元素(已完成但是有一个边界条件不知道怎么改)

(删除单链表的指定值)请编写程序删除单链表中所有值为x的元素。并输出删除x后的链表信息。
【输入】第一行整数n(1<=n)
第二行为单链表中的n个整数
第三行 x,x为int类型
【输出】删除x后的单链表信息
例如:
【输入】
6
3 6 9 10 6 1
6
【输出】
3 9 10 1

#include <stdio.h>
#include <stdlib.h>
typedef struct number{
    int value;
    struct number *next;
}num;
num* add(num* head,int n);
int main()
{
    int n;
    scanf("%d",&n);
    num* head=NULL;
    head=add(head, n);
    
}
num* add(num* head,int n)
{
    int i;
    for (i=0; i<n; i++) {
        num *p=(num*)malloc(sizeof(num));
        scanf("%d",&p->value);
        p->next=NULL;
        num *last=head;
        if (head==NULL) {
            head=p;
        }
        else{
            while (last->next) {
                last=last->next;
            }
            last->next=p;
        }
    }
    int j;
    scanf("%d",&j);
    num * shead=(num *)malloc(sizeof(num));
    shead->next=head;
    num *p=shead;
    while (p->next!=NULL) {
        if (p->next->value==j) {
            num* p1=p->next;
            p->next=p1->next;
            free(p1);
        }
        else
            p=p->next;
        
    }
    head=shead->next;
    free(shead);
    num *point=head;
    while (point->next!=NULL) {
        printf("%d ",point->value);
        point=point->next;
    }
    printf("%d",point->value);
    
    return head;
}

代码运行没问题,但是例如 链表中全部是重复元素,需要删除成空表,程序就会崩溃,例如
输入
3
7 7 7
7
目的是删除链表所有元素,程序就无法运行了,请看看如何修改。

用一个头节点来代表整个链表就可以了,这样的话删除全部也会保留下一个头

你第一个循环last每次都=head,那后面还怎么玩

看我博客