我着是用冒泡法做的 发现每次在对链表的倒数第一个数和倒数第二个数交换的时候 就会出错
#include"stdio.h"
#include<alloc.h>
struct fun{
    int data;
    struct fun *next;
 }*h,*r,*s,*v;
 void chazhao();
 void charu();
 void shanchu();
 void jiaohuan(int);
 int changdu();
 void paixu();
 void print();
 main()
 {
    int num,x;
    printf("输入DTAT ,输入-1结束;\n");
    h=(struct fun*)malloc(sizeof(struct fun));
    r=h;
    scanf("%d",&x);
    while(x!=-1)
    {
        s=(struct fun*)malloc(sizeof(struct fun));
        s->data=x;
        r->next=s;
        r=s;
        scanf("%d",&x);
    }
    r->next=NULL;
    print();
    printf("1.查找\n2.插入\n3.删除\n4.排序\n5.显示\n");
    scanf("%d",&num);
    printf("\n运行结果\n");
    switch(num)
    {
        case 1: chazhao();break;
        case 2: charu(); break;
        case 3:shanchu();break;
        case 4:paixu();break;
        case 5:print();break;
    }
 }
 void chazhao() /*查找*/
 {
    struct fun *p;
    int i=0,k=0;
    p=h;
    printf("要查找的数:");
    scanf("%d",&i);
    for(;p!=NULL&&p->data!=i;k++)
       p=p->next;
    if(p!=NULL)
    printf("值为%d的元素已经找到,在链表位置%d\n",i,k);
    else
    printf("没有找到\n");
    print();
 }
 void charu() /*插入*/
 {
    struct fun *p;
    int num,sum,i;
    p=h;
    printf("插入的位置:数");
    scanf("%d:%d",&num,&sum);
    for(i=0;i<num-1&&p!=NULL;i++)
    p=p->next;
    if(p==NULL)
    printf("错误\n");
    else{
        s=(struct fun*)malloc(sizeof(struct fun));
        s->data=sum;
        s->next=p->next;
        p->next=s;
    }
    print();
 }
 void shanchu()/*删除*/
 {
    struct fun *p,*u;
    int i,sum;
    p=h;
    printf("要删除的位置");
    scanf("%d",&sum);
    for(i=0;i<sum-1&&p!=NULL;i++)
    p=p->next;
    if(p==NULL)
    printf("错误\n");
    else
    {
        u=p->next;
        p->next=u->next;
        free(u);
    }
    print();
 }
void paixu()/*排序*/
 {
    int i,k,q;
    struct fun *p;
    p=h->next;
    q=changdu();
    for(i=0;i<q;i++)
    {
        for(p=h->next;p->next!=NULL;)
        {
            k=p->data;
            if(k>p->next->data)
            {
                jiaohuan(k);
                p=p->next;
            }
            else
            p=p->next;
        }
    }
     print();
 }
void jiaohuan(int i)/*交换*/
 {
    struct fun *p,*u,*t;
    p=h;
    for(;p->next->data!=i;)
    p=p->next;
    t=p->next;
    u=t->next;
    t->next=u->next;
    u->next=t;
    p->next=u;
 }
 int changdu()/*求表的长度*/
 {  int i=0;
    struct fun *p;
    p=h;
    for(;p->next!=NULL;)
    {   i++;
        p=p->next;
    }
    return i;
 }
 void print()/*输出表的内容*/
 {
    struct fun *p;
    p=h;
    for(;p->next!=NULL;)
    {
        p=p->next;
        printf("%d\n",p->data);
    }
 }



											

	    

	