大一初学者,关于单链表冒泡排序的有关问题

大一菜鸟,求助关于单链表冒泡排序的问题
#include"sortScore.h"
#include<stdio.h>
#include"NODE.h"

struct NODE * sortScore(struct NODE *stuList)
{
struct NODE *p1,*p2,*p3,*head;
head = stuList;

for(p3 = stuList ->next;p3 ->next!= NULL;p3 = p3 ->next)
{
head = stuList;
p1 = head ->next;
p2 = p1 ->next;

while(p1 -> next!= NULL)
{

p2 = p1 ->next;

if(p1 ->stuGrade < p2 ->stuGrade)
{
head ->next = p2;
p1 ->next = p2 ->next;
p2 ->next = p1;
}
head = head ->next;
p1 = head ->next;
p2 = p1 ->next;



       }
}
return(stuList);
}

这是我的思路,编译通过了,但是运行到这个函数的时候总是出错。
出现这样的提示:
0x004126b2 处最可能的异常: 0xC0000005: 读取位置 0x00000024 时发生访问冲突
求助!!

------解决方案--------------------
http://blog.****.net/lbsljn/article/details/4223337
------解决方案--------------------
大一初学者,关于单链表冒泡排序的有关问题
0x004126b2 处最可能的异常: 0xC0000005: 读取位置 0x00000024 时发生访问冲突
是指针的越界访问
------解决方案--------------------
代码写得比较混乱啊;单链表的冒泡排序不需要这么麻烦的,款且可以只交换两个节点的值、从而不需要进行节点的增删操作;
p1指向的节点往后移动、即p3指向的节点往后移动,该代码应该无法实现排序功能吧;
出错应该是因为当p1移动到最后一个节点时,p1->next==NULL,然后运行p3=p3->next、则p3==NULL;
然后进行p3->next!=NULL的判断,导致指针越界出错。该p3->next!=NULL改正为p3!=NULL,应该就不会报错了!
建议数值比较后,交换节点内的数值即可!