//单链表操作
#include<stdio.h>
#include<stdlib.h>
#define NN 12
#define MM 20
typedef int ElemType;
struct sNode
{
        ElemType data;
        struct sNode* next;
};
void InitList(struct sNode** HL);   //初始化线形表 
void InsertFirstList(struct sNode** HL,ElemType x);   //向线形表的表头插入一个元素 
void TraverseList(struct sNode* HL);    //遍历线形表 
 int SizeList(struct sNode* HL);      //返回线形表的长度 
 int DeleteValueList(struct sNode** HL,ElemType x);   //删除表中值为x的第一个结点,成功返回1,否则返回0 
void InsertOrderList(struct sNode** HL,ElemType x);   //向线形表中插入元素x结点,使插入后依然有序 
void clearList(struct sNode**HL);     //清除线形表的所有元素,使之成为空表 
void InsertLastList(struct sNode** HL,ElemType x);  //向线形表的表尾插入一个元素 
int main()
{
     int a[NN];
     int i,m;
     struct sNode *p,*h,*s;
     InitList(&p);                //初始化线形表                   
     for(i=0;i<NN;i++) a[i]=rand()%MM;        //随机取值 
     printf("随机数序列:");
     for(i=0;i<NN;i++)  printf("%5d",a[i]);
     printf("\n");
     m=rand();                           //随机取值 
     for(i=0;i<NN;i++) InsertFirstList(&p,m);       //向线形表的表头插入一个元素    
     TraverseList(p);                    //遍历线形表 
     printf("单链表长度:%d\n",SizeList(p));    //返回线形表的长度 
     m=rand();
     for(i=0;i<NN;i++)InsertLastList(&p,m);   //向线形表的表尾插入一个元素
     TraverseList(p);
     printf("单链表长度:%d\n",SizeList(p));
     for(h=p;h!=NULL;h=h->next)
       while(DeleteValueList(&(h->next),h->data));//删除表中值为x的第一个结点
     printf("去除重复数:");
     TraverseList(p);
     printf("单链表长度:%d\n",SizeList(p));
     h=NULL;
     for(s=p;s!=NULL;s=s->next)
         InsertOrderList(&h,s->data);  //向线形表中插入元素x结点,使插入后依然有序 
     printf("有序表序列:");
     TraverseList(h);
     clearList(&p);         //清除线形表的所有元素,使之成为空表 
     getchar();
     getchar();
     return 0;

void InitList(struct sNode** HL)
{
     *HL=NULL;
}  
void  clearList(struct sNode**HL)
{
      struct sNode *cp,*np;
      cp=*HL;
      while(cp!=NULL)
      {
                     np=cp->next;
                     free(cp);
                     cp=np;
      }
      *HL=NULL;
}
int SizeList(struct sNode* HL)
{
    int i=0;
    while(HL!=NULL)
    {
                   i++;
                   HL=HL->next;
    }
    return i;
}
void TraverseList(struct sNode* HL)
{
     while(HL!=NULL)
     {
                    printf("%5d",HL->data);
                    HL=HL->next;
     }
     printf("\n");
}
[color=FF0000][u][i][b][b]void InsertFirstList(struct sNode** HL,ElemType x)
{
     struct sNode *newp;
     newp=(sNode*)malloc(sizeof(struct sNode));
     if(newp==NULL)
     {
                   printf("内存动态空间用完,退出运行!\n");
                   exit(1);
     }
     newp->data=x;
     newp->next=*HL;
     *HL=newp;
}[/b][/b][/i][/u][/color]void InsertOrderList(struct sNode** HL,ElemType x)
{
     struct sNode* cp=*HL,*ap=NULL;
     struct sNode *newp;
     newp=(sNode*)malloc(sizeof(struct sNode));
     if(newp==NULL)
     {
                   printf("内存动态空间用完,退出运行!\n");
                   exit(1);
     }
     newp->data=x;
     if(cp==NULL||x<cp->data)
     {
                    newp->next=cp;
                    *HL=newp;                                   
                    return;
     }
     while(cp!=NULL)
     {
                    if(x<cp->data)  break;
                    else {ap=cp; cp=cp->next;}
     }
     newp->next=cp;
     ap->next=newp;
}
int DeleteValueList(struct sNode** HL,ElemType x)
{
     struct sNode *cp=*HL;
     struct sNode *ap=NULL;
     while(cp!=NULL)
     {
                    if(cp->data==x)  break;
                    ap=cp;
                    cp=cp->next;
     }
     if(cp==NULL)   *HL=(*HL)->next;
     else           ap->next=cp->next;
     free(cp);
     return 1;
}
void InsertLastList(struct sNode** HL,ElemType x)
{
     struct sNode *newp;
     newp=(sNode*)malloc(sizeof(struct sNode));
     if(newp==NULL)
     {
                   printf("内存动态空间用完,退出运行!\n");
                   exit(1);
     }
     newp->data=x;
     newp->next=NULL;
     if(*HL==NULL)   *HL=newp;
     else   {  
                struct sNode*p=*HL;
                while(p->next!=NULL)   p=p->next;
                p->next=newp;   
             }
}


红色部分是在练表头插入一个元素的算法.但是运行之后发现插完后P只有第一个结点了.后面的不见了.怎么回事呢?