你的程序用了链表,链表的交换可不是你程序中那么简单,修改如下:w->next=s;
p->next=s->next;
s->next=p;其中w指向p 的前一个结点,所以当p为头结点时交换代码如下:
p->next=s->next;
s->next=p;

解决方案 »

  1.   

    如楼上的楼上所言,你发须记住p的前一结点,同时由于你有可能改变头结点所以最好
    struct pcb **kp=*k
      

  2.   

    我的代码第一部分用来代换原代码第14——18行。删掉后面那个 else ,再加入:w=s;s=p->next;
    在for循环之前加:
    if(if(p->pri<s->pri)
    {
        p->next=s->next;
        s->next=p;
    }
    w=s;s=p->next;
    这样就OK了
      

  3.   

    算法是对的呀。可能是链表的事,I DON‘T KNOW
      

  4.   


    你对指针的掌握程度很还不够深,须努力!下面的程序绝对没有任何问题,我特意在Visual C++下建立了一个链表进行测试了一下void bubblesort(struct pcb *k,int n)//n为要排序元素的个数
    {
    int i,j;
    struct pcb *p,*s;
    p=k;
    pcb w;
    if(p->next==NULL)
    {
    printf("it is NULL\n");
    return ;
    }
    else
    {
    for(i=n;i>1;i--)

    //每次遍历链表的时候均应该初始化指针变量
    p=k;
    s=p->next;

    for(j=1;j<i;j++)
    {
    if(s)
    if(p->pri<s->pri)
    {
    //在此不需要每次都开辟新的内存单元,
    //你的做法很用以造成内存泄漏
        //因为你的做法是不移动链表的内存逻辑结构
         //从而,只需要一个局部变量w 并修改小相应 //的指针的数据即可,但是不要动指针的next 值
         //否则就无法使用指针变量k 来返回链表的头 //指针了
         w=*s;
      s->pri=p->pri;
        p->pri=w.pri;
    }  
    if(s->next!=NULL)
    {
    p=s;
    s=s->next;
    }
    }
    }
    }
    }
      

  5.   

    页面效果太差,重贴!你对指针的掌握程度很还不够深,须努力!下面的程序绝对没有任何问题,我特意在Visual C++下建立了一个链表进行测试了一下void bubblesort(struct pcb *k,int n)//n为要排序元素的个数
    {
    int i,j;
    struct pcb *p,*s;
    p=k;
    pcb w;
    if(p->next==NULL)
    {
    printf("it is NULL\n");
    return ;
    }
    else
    {
    for(i=n;i>1;i--)

    //每次遍历链表的时候均应该初始化指针变量
    p=k;
    s=p->next;

    for(j=1;j<i;j++)
    {
    if(s)
    if(p->pri<s->pri)
    {
    //在此不需要每次都开辟新的内存单元,
    //你的做法很容易造成内存泄漏
     //因为你的做法是不改变链表的内存逻辑结构
     //从而,只需要一个局部变量w 并修改相相应 //的指针的数据即可,但是不要动指针的next 值
     //否则就无法使用指针变量k 来返回链表的头指针了
         w=*s;
      s->pri=p->pri;
        p->pri=w.pri;
    }  
    if(s->next!=NULL)
    {
    p=s;
    s=s->next;
    }
    }
    }
    }
    }