生成头结点的时候 是用了前面插入的 方法
所以在输出的时候 是逆序输出 就地逆置 后 刚好 和输入时 相同
只做了 两个 或两个以上的结点可以运行
如果是一个结点的
就 自己在函数里面加一条 判断语句 if(rear) return;
就可以了
#include <stdio.h>
#include <stdlib.h>
#define LEN sizeof(struct LNode)
typedef struct LNode
{
int
data;
struct LNode *next;
}*LinkList;
//创建一个带头结点的单链表
void Creat_List( LinkList &L, int n )
{
LinkList pf;
int i;
L = ( LinkList ) malloc ( LEN );
if( L == NULL )
{
printf("ERROR!\n");
return;
}
L->next = NULL;
for( i = 0; i<n; i++ )
{
pf = ( LinkList ) malloc ( LEN );
scanf("%d", &pf->data);
pf->next = L->next;
L->next = pf;
}
}
//输出
带头结点的链表
void Output_List( LinkList &L )
{
LinkList pb;
pb = L->next;
while( pb )
{
printf("%d ",pb->data);
pb = pb->next;
}
printf("\n");
}
// 就地逆置 带头结点
void
Backwards_List( LinkList &L )
{
//方法:第一个结点指向NULL
//第二个结点指向第一个 第三个指向第二个
// 可以看成是 只改变了 结点的 指向 而没有改变 位置
LinkList
pa, rear, y;
pa = L->next;
rear = pa->next;
if( rear )return ;
pa->next = NULL;
y = rear->next;
rear->next = pa;
pa = rear;
rear = y;
while( rear->next )
{
y = rear->next;
rear->next = pa;
pa = rear;
rear = y;
}
rear->next = pa;
L->next = rear;
}
void main()
{
LinkList L;
int n;
printf("输入链表 L 结点的个数:");
scanf("%d", &n);
printf("\n");
printf("输入结点元素:");
Creat_List( L, n);
printf("输出排序前的 L 链表:");
Output_List( L );
printf("\n");
Backwards_List( L );
printf("输出逆置后的 L 链表:");
Output_List( L );
printf("\n");
}