带头结点的单链表删除为x的节点,为什么输出不对

#include<stdio.h>
#include<stdlib.h>
typedef struct lnode{
int data;
struct lnode *next;
}lnode,*linklist ;
int a[4]={1,2,3,4};
int n=4;
void buildlist(linklist &L)
{
L=(linklist)malloc(sizeof(lnode));
lnode *s,*r=L;//数据指针,指向需要赋值的元素;p前驱指针,开始时指向表头
for(int i=0;i<n;i++)
{
s=(lnode *)malloc(sizeof(lnode));
s->data=a[i];
r->next=s;
r=r->next;
}
}
void disp(linklist L)
{
lnode *s=L->next;
while(s)
{
printf("%d",s->data);
s=s->next;
}
}
void deletex(linklist &L,int x)
{
lnode *p=L->next,*q,*r=L;
while(p)
{
if(p->data!=x)
{
r->next=p;
r=p;
p=p->next;
}
else
{
q=p;
p=p->next;
free(q);
}
}
}
int main()
{
linklist L;
buildlist(L);
disp(L);
deletex(L,3);
disp(L);
return 0;
}

修改如下,供参考:

#include<stdio.h>
#include<stdlib.h>
typedef struct lnode {
    int    data;
    struct lnode* next;
}lnode, * linklist;
int a[4] = { 1,2,3,4 };
int n = 4;
void buildlist(linklist& L)
{
    L = (linklist)malloc(sizeof(lnode));
    lnode* s, * r = L;//数据指针,指向需要赋值的元素;p前驱指针,开始时指向表头
    for (int i = 0; i < n; i++)
    {
        s = (lnode*)malloc(sizeof(lnode));
        s->next = NULL;  //修改
        s->data = a[i];
        r->next = s;
        r = s;//r = r->next; 修改
    }
}
void disp(linklist L)
{
    lnode* s = L->next;
    while (s)
    {
        printf("%d ", s->data);
        s = s->next;
    }
    printf("\n");
}
void deletex(linklist& L, int x)
{
    lnode* p = L->next, * q, * r = L;
    while (p)
    {
        if (p->data != x)
        {
            //r->next = p;//修改
            r = p;        //修改
            p = p->next; 
        }
        else
        {
            q = p;      
            r->next = p->next;//修改
            //p = p->next;
            free(q);
            p = r;       //修改
        }
    }
}
int main()
{
    linklist L;
    buildlist(L);
    disp(L);
    deletex(L, 3);
    disp(L);
    return 0;
}

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

typedef struct lnode{
int data;
struct lnode *next;
}linklist;

int a[4]={1,2,3,4};
int n=4;
void buildlist(linklist *L)
{
for(int i=0;i<n;i++)
{
L->data = a[i];
L->next=(linklist *)malloc(sizeof(linklist));
printf("L->data %d,i = %d\n",L->data,i);
L = L->next;
}
}
void disp(linklist *L)
{
linklist *s=L;
while(s!=NULL)
{
printf("%d",s->data);
s=s->next;
}
}
void deletex(linklist *L,int x)
{
linklist *p= L->next;
linklist *q,*r=L;
while(p)
{
if(p->data!=x)
{
r->next=p;
r=p;
p=p->next;
}
else
{
q=p;
p=p->next;
free(q);
}
}
}
int main()
{
linklist *L,*P;
P=(linklist *)malloc(sizeof(linklist));
L = P;
buildlist(P);

if(L==NULL)
printf("error \n");

disp(L);
printf("\n");
deletex(L,3);
printf("\n");
disp(L);
return 0;
}