链表交换节点有两种方式:
专业成都网站建设公司,做排名好的好网站,排在同行前面,为您带来客户和效益!创新互联建站为您提供成都网站建设,五站合一网站设计制作,服务好的网站设计公司,成都网站制作、网站设计、外贸网站建设负责任的成都网站制作公司!
1.
交换结点内容
2.
交换结点位置
如定义以下结构体,分为数据部分和链表指针部分
struct _data {
int num;
float score;
} ;
struct stu
{
struct _data data;
struct stu *next;
}*head, *p1,*p2,*p3,*p4;
head-p1-p2-p3-p4 ;交换结点内容,结点顺序不变,依然保持原样,则交换两个结点时,只交换数据部分,next指针不要动,如:交换p1和p3的内容(数据):
struct _data t=p1-data;p1-data=p3-data;p3-data=t ;//这样就可以了。交换结点位置,链表的顺序会发生变化,为保持链表的正常衔接,则要重新设置next的值,过程略有复杂,如:交换p1,p3的位置:最终变成:head-p3-p2-p1-p4
;
首先,要找到p1的原前趋结点head,和p3的前趋结点p2
然后,开始重新分配链表的排列:
1、p1的原前趋结点(head)的新后继结点 要变成p3
2、p1的新后继结点要变成p3的原后继结点(p4)
3、p3的原前趋结点(p2)的新后继结点 要变成p1
4、p3的新后继结点要变成p1的原后继结点(p2)
struct stu *p1p, *p3p, *p;
for( p=head;p!=NULL;p=p-next )
{
if ( p-next==p1 )
p1p=p; //找到p1的前趋head
if ( p-next==p3 )
p3p=p;//找到p3的前趋p2
}
p1p-next=p3;//p1的原前趋结点 的 新后继结点 变成p3 head-p3
struct stu *tNext=p1-next ; //保存p1的原后继结点(p2)
p1-next=p3-next; //p1的新后继结点要变成p3的原后继结点(p4) p1-p4
p3p-next=p1; //p3的原前趋结点 的 新后继结点 变成p1 p2-p1
p3-next=tNext ; //p3的新后继结点 变成p1的原后继结点 p3-p2
void Swap(intx,inty)
{
int temp=0;
temp=x;
x=y;
y=temp;
}
int main()
{
int a=1;
int b=2;
Swap(a,b);
coutlt;lt;"a="lt;lt;alt;lt;endl;
coutlt;lt;"b="lt;lt;blt;lt;endl;
system("pause");
return 0;
}
运行结果:
扩展资料:
用指针交换:
void Swap(int*x,int*y)
{
int temp=0;
temp=*x;
*x=*y;
*y=temp;
}
int main()
{
int x=1;
int y=2;
Swap(x,y);
printf("x=%d,y=%d\n",x,y);
system("pause");
return 0;
}
运行结果:
X=2;Y=1
如有不懂可留言
void NodSwap(struct node *A_1, struct node *A_2, struct node *A_3)
{
A_1-next = A_3;
A_2-next = A_3-next;
A_3-next = A_2;
}
调换的是A_1\A_2结点,可以直接调用
交换函数很好写。
比较难的读文件。文件格式 与 读语句要 相配。 特别是 多余 的 空行和回车键。
调试时用 printf 语句 检查 读得对不对。
fgets() 函数可用来读整行的字符串,含回车键。
#include stdio.h
#includestdlib.h
void jh(char *a, char *b){
char x[100];
strcpy(x,a),strcpy(a,b),strcpy(b,x);
}
int main(){
FILE *fp;
int n,i,j;
char a[100];
char b[100];
char ch;
if((fp=fopen("2.2.txt","r"))==NULL){
printf("Error");
exit(0);
}
fgets(a,100,fp);
sscanf(a,"%d",n);
//printf("n=%d\n",n);
for(j=1;j=n;j++){
fgets(a[0],100,fp);
//printf("read a: %s",a);
fgets(b[0],100,fp);
// printf("read b: %s",b);
printf("Case %d\n",j);
jh(a,b);
printf("%s",a);
printf("%s",b);
fgets(a[0],100,fp); // 假定2组数间只有一个空白行,则用它跳过。
}
fclose(fp);
return 0;
}
有2方法:
第一,找到要交换的2个结点,将2个结点内的数据交换就完成2个结点交换.
因为2个结点不同就是2个结点内数据有区别.
第二,拿掉2个结点,并保持链表完好,再将2结点前后倒置,插到原位置.
当然,如果是双向链表要麻烦些,但思路是一致的.