原函数如下:
头文件:
void sort(struct Node* ListheadNode)//按学号排序
{
struct Node* q;
if(ListheadNode==NULL)
{
printf("还没有学生信息,请增加学生信息\n");
return;
}
while(ListheadNode)//两层循环完成排序
{
q=ListheadNode->next;
struct Node* tempNode = (struct Node*)malloc(sizeof(struct Node));//生成变量
tempNode->next = NULL;//初始化一个结构体变量
while(q)
{
if(q->data.num < ListheadNode->data.num) //学号由小到大
{
strcpy(tempNode->data.name,q->data.name);
strcpy(tempNode->data.num,q->data.num);
tempNode->data.age=q->data.age;
strcpy(tempNode->data.tele,q->data.tele);
strcmp(tempNode->data.addr,q->data.addr);
/*再复制p结点信息到q*/
strcpy(q->data.num,ListheadNode->data.num);
strcpy(q->data.name,ListheadNode->data.name);
q->data.age=ListheadNode->data.age;
strcpy(q->data.tele,ListheadNode->data.tele);
strcmp(q->data.addr,ListheadNode->data.addr);
/*最后复制exchange结点信息到p*/
strcpy(ListheadNode->data.name,tempNode->data.name);
strcpy(ListheadNode->data.num,tempNode->data.num);
ListheadNode->data.age=tempNode->data.age;
strcpy(ListheadNode->data.tele,tempNode->data.tele);
strcmp(ListheadNode->data.addr,tempNode->data.addr);
}
q=q->next;
}
ListheadNode=ListheadNode->next;
}
printf("刷新后的学生信息是:\n");
printlist(ListheadNode);
}
出啥问题了?
strcmp(tempNode->data.addr,q->data.addr); 写错了吧?应该是strcpy啊
这样交换感觉效率比较低,可以用直接排序法,在一次循环中先找出num最小的节点指针,然后只需要将这个节点值与本次比较的基础节点的值进行交换就行了。
你的头结点存数据吗,存数据和不存数据的排序略有差别
if(q->data.num < ListheadNode->data.num)这里写错了,字符数组的比较需要用strcmp函数,应该是
if( strcmp(q->data.num , ListheadNode->data.num) > 0)
这样排
{
int i,j;
struct Node* t;
int n;//n为待排序数据个数
for (i = 0; i < n-1; i++)
{
for (j = 0; j <n-i-1; j++)
{
if (ListheadNode->data.num > q->data.num)
{
t = q->data;
q->data = ListheadNode->data;
ListheadNode->data = t;
}
}
}
}