原链表如下:
C语言链表如何倒置?
第一步:初始化
将头结点的下缀置空,然后将其作为尾结点,如图
代码如下:
struct LNode *b,*c;
b=a;//*a代表头结点
c=b->next;//*暂时保存头结点之后的信息
b->next=NULL;//*将*b的后缀指向NULL
第二步:循环
1.将原链表的第二个结点看做倒数第二个结点并将下缀指向该结点在原链表时的前缀,如图
2.重复类似算法
将原链表的第三个结点看做倒数第三个结点并将下缀指向该结点在原链表时的前缀,如图
连续进行相同算法,即可实现将链表倒置
代码如下:
while(c)
{
struct LNode *d;
d=c->next//*暂时储存剩余链表
c->next=b;//*c后缀指向*b
b=c;//* *b指向*c的信息的形态 *//
c=d;//*指向下一个结点
}
完整代码如下:
#include <stdio.h>
#include <stdlib.h>
struct LNode
{
int data;
struct LNode *next;
};
struct LNode *a0()
{
struct LNode *a;
a=(struct LNode*)malloc(sizeof(struct LNode));
a->next=NULL;
return a;
}
struct LNode *a1()
{
struct LNode *a,*b;
a=a0();
b=a;
int c[]={1,3,5,8,10,13,18,20,22,23,24,37,40},d;
for(d=0;d<sizeof(c)/sizeof(int);d++)
{
struct LNode *e;
e=a0();
e->data=c[d];
b->next=e;
b=e;
}
return a;
}
struct LNode *a2(struct LNode *a)
{
struct LNode *b,*c;
b=a;
c=b->next;
b->next=NULL;
while(c)
{
struct LNode *d;
d=c->next;
c->next=b;
b=c;
c=d;
}
return b;
}
void Windows_system()
{
char aa[]="Math Dash的链表程序倒置程序";
char ab[strlen(aa)+6];
sprintf(ab,"title %s",aa);
system(ab);
puts(aa);
struct LNode *a,*b;
a=a1();//*创建单链表
b=a->next;
puts("链表倒置前:");
while(b)
{
printf("%d\n",b->data);
b=b->next;
}
a=a2(&(*a));//*单链表倒置
b=a;
puts("链表倒置后:");
while(b->next)
{
printf("%d\n",b->data);
b=b->next;
}
system("pause");
}
main()
{
Windows_system();
return 0;
}
程序运行如下:
Math Dash的链表程序倒置程序
链表倒置前:
1
3
5
8
10
13
18
20
22
23
24
37
40
链表倒置后:
40
37
24
23
22
20
18
13
10
8
5
3
1
请按任意键继续. . .