求解数据结构一道题,链表有关问题!

求解数据结构一道题,链表问题!!
题目要求:一个链表三个域:数据、频率、next指针。 然后建表,初始化都为零。然后给链表scanf几个数据,然后用函数找相应的值,找到频率加,否则将其插入到链表尾部。然后显示出来!
下面是我写的源码,求大神修改。
#include<stdio.h>
#include<malloc.h>
typedef struct LNode
{
    int data;  //数据
    int fieq;    //频率
    struct LNode *next; //next指针
}*Linklist ;


void Creat(Linklist &L)
{
    L=(Linklist)malloc(sizeof(LNode));
    if(!L)
        exit(0);
    else
        L->next=NULL;
    printf("构建成功!\n");
}

void FindLNode(Linklist &L,int x)
{
    Linklist p,q;
    p=L->next;
    q=L;
    while(p!=NULL)
    {
        if(p->data==x)
        {

            p->fieq++;
            q->next=p->next;  //取出该节点

            Linklist r,s;
            r=p->next;
            s=q;
            while(r!=NULL)
            {
                //重新插入
                if(r->fieq<=p->fieq)
                {
                    p->next=s->next;
                    s->next=p;

                }
                s=s->next;
                r=r->next;
            }

        }
            q=q->next;
            p=p->next;
        }
        if(p==NULL)
        {
            Linklist s;
            s->data=x;
            s->fieq=0;
            s->next=NULL;
            if(L->next==NULL)
            {
                L->next=s;
                s->next=NULL;
            }

        }

    }

    void print(Linklist L)
    {
        Linklist p=L->next;
        while(p!=NULL)
        {
            printf("[%d 出现 %d次]\n",p->data,p->fieq);
            p=p->next;
        }

    }
    int main()
    {
        Linklist a;
        printf("构建一个新链表:");
        Creat(a);
        FindLNode(a,5);
        FindLNode(a,1);
        FindLNode(a,2);
        FindLNode(a,3);
        FindLNode(a,4);
        FindLNode(a,4);
        print(a);
        return 0;
    }
为什么显示的时候链表a时,只显示如图呢?求解数据结构一道题,链表有关问题!
------解决思路----------------------
 Creat(a)
只是创建一个链表节点,并不是链表
------解决思路----------------------

if(p==NULL)
         {
             Linklist s;
             s->data=x;
             s->fieq=0;
             s->next=NULL;
             if(L->next==NULL)
             {
                 L->next=s;
                 s->next=NULL;
             }

         }


这段代码,如果p为空,就新建一个结点,然后把L指向它,L作为头结点,每次都指向新建结点,而新建的结点又指向NULL,那你怎么保存原有的结点呢。
------解决思路----------------------

#include<stdio.h>
 #include<malloc.h>
 typedef struct LNode
 {
     int data;  //数据
    int fieq;    //频率
    struct LNode *next; //next指针
}*Linklist ;


 void Creat(Linklist &L)
 {
     L=(Linklist)malloc(sizeof(LNode));
     if(!L)
         exit(0);
     else
         L->next=NULL;
     printf("构建成功!\n");
 }

 void FindLNode(Linklist &L,int x)
 {
     Linklist p,q;
     p=L->next;
     q=L;
//你的写法和你的要求不相符啊,频率高的在前,应该从前往后比呀
     while(p!=NULL)
     {
         if(p->data==x)
         {

             p->fieq++;
             q->next=p->next;  //取出该节点

            Linklist r,s;
             r=L->next;
             s=L;
             while(r->next!=p)
             {
                 //重新插入
                if(r->fieq<p->fieq)
                 {
                     s->next=p;
                     p->next=r;
return;
                 }
                 s=s->next;
                 r=r->next;
             }

         }
             q=q->next;
             p=p->next;
         }
         if(p==NULL)
         {
             Linklist s=(Linklist)malloc(sizeof(LNode));//没初始化就用,运行竟然没崩溃?
             s->data=x;
             s->fieq=0;
             s->next=NULL;
             
             if(L->next==NULL)
             {
                 L->next=s;
                 s->next=NULL;
             }
//新加的,不然新结点怎么添加
else
{
q->next=s;
s->next=NULL;    
}
         }

     }

     void print(Linklist L)
     {
         Linklist p=L->next;
         while(p!=NULL)
         {
             printf("[%d 出现 %d次]\n",p->data,p->fieq);
             p=p->next;
         }

     }
     int main()
     {
         Linklist a;
         printf("构建一个新链表:");
         Creat(a);
         FindLNode(a,5);
         FindLNode(a,1);
         FindLNode(a,2);
         FindLNode(a,5);
         FindLNode(a,3);
         FindLNode(a,4);
         FindLNode(a,4);
         FindLNode(a,3);
         FindLNode(a,3);
         print(a);
         getchar();
         return 0;
     }

------解决思路----------------------
引用:
while(r->next!=p)
            {
                if(r->fieq<p->fieq)
                {
                    s->next=p;
                    p->next=r;
                   return ;
                }
                s=s->next;
                r=r->next;
            }

谢谢哈,你修改的真不错!学到了很多。但还有一点不懂那个return在哪里有什么意思????

结点插入好了,这个函数此次使命就完成了,用return结束函数的执行,返回到主函数。