这个给链表排序为什么是错的?如何修改

pMove=head;
while(pMove!=NULL)
{
strcpy(i,pMove->clas);
strcpy(j,pMove->next->clas);
if(strcmp(i,j)>0)
{
strcpy(na,i);
strcpy(i,j);
strcpy(j,na);
}
pMove=pMove->next;
}
pMove=head;
while (pMove != NULL)
{
printf("%5s%5s%20s%5s%20s%20s%20s%10s\n", pMove->name, pMove->sex, pMove->major,
pMove->clas, pMove->birthday, pMove->stu_code, pMove->id_code, pMove->enyear);
pMove = pMove->next;
}

修改调试通过,带头结点链表,供参考:

 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct dat {
    char name[5];
    char sex[5];
    char majo[20];
    char clas[5];
    char birthday[20];
    char stu_code[20];
    char id_code[20];
    char enyear[10];
}Data;
typedef struct lnode {
    Data   data;
    struct lnode* next;
}LNode;
void sort(LNode *head)
{
    LNode* pMove = head->next, * pNext = NULL;
    Data   na;
    while(pMove)
    {
        pNext = pMove->next;
        while (pNext != NULL)
        {
            if (strcmp(pMove->data.clas, pNext->data.clas) > 0)
            {
                na = pMove->data;
                pMove->data = pNext->data;
                pNext->data = na;
            }
            pNext = pNext->next;
        }
        pMove = pMove->next;
    }
    pMove = head->next;
    while (pMove != NULL)
    {
        printf("%5s%5s%20s%5s%20s%20s%20s%10s\n", pMove->data.name, 
                 pMove->data.sex, pMove->data.majo,pMove->data.clas, 
                 pMove->data.birthday, pMove->data.stu_code, 
                 pMove->data.id_code, pMove->data.enyear);
        pMove = pMove->next;
    }
}

这里交换的是 i j 的值strcpy(na,i); strcpy(i,j); strcpy(j,na);,并没有交换链表的结点值。
修改为:
strcpy(na, pMove->data);//交换的是结点的数据域内容
strcpy(pMove->data, pMove->next->data);
strcpy(pMove->next->data, na);