节点交换有两种思路,第一种是交换内容而不交换指针,第二种是直接改变指针而不交换节点内容。
链表节点定义如下:
struct stud /*定义一个结构体类型struct stud*/
{
char sno[40]; //学号
char name[40]; //姓名
float score[3]; //三科成绩
struct stud *next; //下一节点
};
第一种思路的代码如下,首先涉及到交换函数的写法,归为两类,一类是数字交换,另一类是字符串交换。
指针实现的字符串交换代码如下:
void swap_s(char* src, char* dst)
{
char tmp ;
int a = strlen(src)>strlen(dst)?1:0;
tmp = *src;
*src=*dst;
*dst=tmp;
while(*src++ && *dst++)
{
tmp = *src;
*src=*dst;
*dst=tmp;
}
if(a)
{
while(*src)
{
dst++;
*dst=*src++;
}
*dst='\0';
}
else
{
while(*dst)
{
*src=*dst++;
src++;
}
*src='\0';
}
return ;
}
也可以这样写:
void swap_s(char *str1,char *str2)
{
char str[40];
char *p=str,*p1=str1,*p2=str2;
while((*p++=*p1++)!=NULL);
p=str;
p1=str1;
while((*p1++=*p2++)!=NULL);
p2=str2;
while((*p2++=*p++)!=NULL);
}
数字交换代码如下:
void swap_f(float* src, float* dst)
{
float tmp;
tmp = *src;
*src=*dst;
*dst=tmp;
return ;
}
节点交换代码:
void swap(Student *src,Student *dst)
{
Student *tmp = NULL;
swap_s(src->sno,dst->sno);
swap_s(src->name,dst->name);
swap_f(&src->score[0],&dst->score[0]);
swap_f(&src->score[1],&dst->score[1]);
swap_f(&src->score[2],&dst->score[2]);
return ;
}