c语言数据结构单链表问题

问题:以单链表的首结点值x为基准将该单链表分割为两部分,使所有小于x的结点排在大于或等于x的结点之前。
我写了这段代码输入后没反应,求看看是怎么回事。其中首结点值L->data=3

#include 
#include 
typedef int ElemType;
typedef struct LNode  
{
    ElemType data;//数值域 
    struct LNode *next;        //指向后继结点  //指针域 
} LinkNode;
void CreateListR(LinkNode *&L,ElemType a[],int n);
void DispList(LinkNode *L);
void InitList(LinkNode *&L,LinkNode *&P,int n);
int main()
{
    LinkNode*L;
    LinkNode*P;
    int i,j,n;
    char s;
    scanf("%d",&n);
    int a[n];
    for(i=0;i'\n';i++)//遇到回车结束循环
    {
        scanf("%d",&a[i]);
        s=getchar();//获取回车键信息
    }
    CreateListR(L,a,n);
    InitList(L,P,n);
    DispList(L);
    return 0;
 }
void CreateListR(LinkNode *&L,ElemType a[],int n)
//尾插法建立单链表
{
    LinkNode *s,*r;
    L=(LinkNode *)malloc(sizeof(LinkNode));      //创建头结点
    L->data=3;
    L->next=NULL;
    r=L;                    //r始终指向终端结点,开始时指向头结点(r代表L,保持L头结点指针不变,才能正常输出链表)
    for (int i=0;i//创建新结点s
        s->data=a[i];
        r->next=s;            //将结点s插入结点r之后 //r->next指向数值域 //以下两行为核心
        r=s;        //r=r->next,即让指针r向后移动 
    }
    s->next=NULL;            //终端结点next域置为NULL
}
void DispList(LinkNode *L)
{
    LinkNode *p=L->next;
    while (p!=NULL)
    {    printf("%d ",p->data);
        p=p->next;
    }
    printf("\n");
}
void InitList(LinkNode *&L,LinkNode *&P,int n)
{
    int i,k=0;
    P=(LinkNode *)malloc(sizeof(LinkNode));      //创建头结点
    LinkNode *w;
    LinkNode *r,*e,*a;
    w=P;
    r=L;
    e=L;
    for(i=0;iif(r->data>L->data)
        {
            w->next=a->next;
            e->next=e->next->next;
            a->next=e->next;
            w=w->next;
            k++;
        }
    
    }
    for(i=0;ir=r->next;
    w->next=NULL;
    r->next=P->next;
}

for(i=0;i<k;i++)
r=r->next;
w->next=NULL;
r->next=P->next;
你这个循环只能管到下面第一行,后面2行在for循环外面呢

单链表的首结点,不是头结点,代码里是把x写在了头结点里了,void InitList(LinkNode *&L,LinkNode *&P,int n)函数写得也有问题,修改如下,供参考:

#include <stdio.h>
#include <malloc.h>
typedef int ElemType;
typedef struct LNode
{
    ElemType data;//数值域 
    struct LNode* next;        //指向后继结点  //指针域 
} LinkNode;
void CreateListR(LinkNode*& L, ElemType a[], int n);
void DispList(LinkNode* L);
void InitList(LinkNode*& L);   //void InitList(LinkNode*& L, LinkNode*& P, int n);  修改
int main()
{
    LinkNode* L;
    LinkNode* P;
    int i, j, n;
    char s;
    scanf("%d", &n);
    int a[100];                     // 修改
    for (i = 0; i < n && s != '\n'; i++)//遇到回车结束循环 
    {
        scanf("%d", &a[i]);
        s = getchar();//获取回车键信息
    }
    CreateListR(L, a, i);  //CreateListR(L, a, n); 修改
    InitList(L);           //InitList(L, P, n);    修改
    DispList(L);
    return 0;
}
void CreateListR(LinkNode*& L, ElemType a[], int n) 
//尾插法建立单链表
{
    LinkNode* s, * r;
    L = (LinkNode*)malloc(sizeof(LinkNode));//创建头结点
    L->data = 3;                            //这句多余
    L->next = NULL;
    r = L;                    //r始终指向终端结点,开始时指向头结点(r代表L,保持L头结点指针不变,才能正常输出链表)
    for (int i = 0; i < n; i++)
    {
        s = (LinkNode*)malloc(sizeof(LinkNode));//创建新结点s
        s->data = a[i];
        r->next = s;//将结点s插入结点r之后 //r->next指向数值域 //以下两行为核心
        r = s;  //r=r->next,即让指针r向后移动 
    }
    s->next = NULL;//终端结点next域置为NULL
}
void DispList(LinkNode* L)
{
    LinkNode* p = L->next;
    while (p != NULL)
    {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}
void InitList(LinkNode*& L)  //修改
{
    ElemType  x;
    LinkNode* p = L->next, * t = NULL, * h = NULL, * s = NULL; //以下修改
    L->next = NULL;
    x = p->data;        //取得首结点的值 x
    while (p) {
        t = p;         //脱离取得链表的一个结点
        p = p->next;
        t->next = NULL;
        if (!L->next) //以下,将脱离出的结点 t 按照要求重新链入链表 L 
            L->next = t;
        else if (t->data > x)
        {
            h = L;
            while (h->next) h = h->next;
            h->next = t;
        }
        else {
            h = L->next; s = L;
            while (h && h->data < x) s = h, h = h->next;
            if (s == L) {
                t->next = L->next;
                L->next = t;
            }
            else {
                t->next = s->next;
                s->next = t;
            }
        }
    }
}
#if 0       //以下删除
    int i, k = 0;
    P = (LinkNode*)malloc(sizeof(LinkNode));      //创建头结点
    LinkNode* w;
    LinkNode* r, * e, * a;
    w = P;
    r = L;
    e = L;
    for (i = 0; i < n; i++)
    {
        r = L;
        e = L;
        a = L;
        if (r->data > L->data)
        {
            w->next = a->next;
            e->next = e->next->next;
            a->next = e->next;
            w = w->next;
            k++;
        }

    }
    for (i = 0; i < k; i++)
        r = r->next;
    w->next = NULL;
    r->next = P->next;
#endif

运行结果如下图:

img