此方法的原理:
通过一次次的把旧链表的信息导出,再一次次的用前插法把旧链表的信息导入新链表,从而实现链表的倒置
前插法:
前插法是通过将新结点逐个插入链表的头部(头结点之后)来创建单链表,每次申请一点,读入相应的数据元素值,然后将新结点插入到头结点之后
代码如下:
#include <stdio.h>
#include <stdlib.h>
struct Test
{
int data;
struct Test *next;
};
struct Test Math_Dash()
{
struct Test *a;//*创建头结点
struct Test *c;
a=(struct Test*)malloc(sizeof(struct Test));//*为头结点分配内存
a->next=NULL;//*指针域置空
c=a;
int f;
for(f=1;f<=20;f++)//*尾插法
{
struct Test *b;//*创建新结点
b=(struct Test*)malloc(sizeof(struct Test));//*为新结点分配内存
b->data=f;//*为新结点添加信息
b->next=NULL;//*指针域置空
c->next=b;//*插入链表尾
c=b;//*指向新结点
}
return *a;
}
struct Test Math_Dash2()
{
struct Test *a;//*创建头结点
a=(struct Test*)malloc(sizeof(struct Test));//*为头结点分配内存
a->next=NULL;//*指针域置空
struct Test *b;
b=Math_Dash().next;
while(b)//*前插法
{
struct Test *c;//*创建新结点
c=(struct Test*)malloc(sizeof(struct Test));//*为新结点分配内存
c->data=b->data;//*添加原信息到新结点
c->next=a->next;
a->next=c;//*将新结点插入链表头
b=b->next;//*指向下一个结点
}
return *a;
}
int main(int argc, char *argv[])
{
struct Test *a,*b;
a=Math_Dash().next;
b=Math_Dash2().next;
printf("链表倒置之前\n");
while(a)
{
printf("%d\n",a->data);
a=a->next;
}
printf("链表倒置之后\n");
while(b)
{
printf("%d\n",b->data);
b=b->next;
}
system("pause");
return 0;
}
程序运行结果: