/*
反向输出链表:
1.不改变链表结构:递归输出
2.改变链表结构:反转链表
*/
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode{
int data;
struct LNode * next;
} LNode,*LinkList;
LinkList initList( int n );
void printList( LinkList );
//void revePrintList( LinkList );
void revePrintList( LinkList );
void destroyList( LinkList );
int main()
{
int n;
puts("请输入创建结点数: ");
scanf("%d",&n);
LinkList head = initList(n);
puts("\n链表内容如下: ");
printList(head);
puts("\n反向输出链表: ");
//revePrintList(head->next);
revePrintList(head);
destroyList(head->next);
putchar('\n');
system("pause");
return 0;
}
LinkList initList(int n)
{
LinkList L = (LinkList)malloc(sizeof(LNode));
if( !L )
{
puts("分配失败...");
exit(1);
}
LinkList temp = L;
int i;
for ( i = 0; i < n; i++ )
{
LinkList p = (LinkList)malloc(sizeof(LNode));
if( !p )
{
puts("分配失败...");
exit(1);
}
printf("请输入第%d个结点的数据:",i+1);
scanf("%d",&p->data);
p->next = NULL;
temp->next = p;
temp = temp->next;
}
return L;
}
void printList( LinkList h )
{
LinkList temp = h->next;
while( temp )
{
printf("%d\t",temp->data);
temp = temp->next;
}
}
//不改变链表结构
//void revePrintList(LinkList h)
//{
// if( h->next )
// revePrintList(h->next);
// printf("%d\t",h->data);
//}
//改变链表结构
void revePrintList(LinkList h)
{
LinkList prev = NULL;
LinkList head = h->next;
LinkList nexts;
while( head )
{
nexts= head->next;
head->next = prev; // 将第结点陆续分离出来
prev = head;
head = nexts;
}
h->next = prev;
LinkList p = prev;
while ( p )
{
printf("%d\t",p->data);
p = p->next;
}
}
void destroyList(LinkList h)
{
LinkList temp;
while (h)
{
temp = h;
h = h->next;
free(temp);
}
}