单链表的逆置操作

#include
#include

typedef struct LNode {

int data;
struct *next;
}LNode,*LinkList;

int main()
{

int creattouchafa(LinkList L,int n);
LinkList nizhi(LinkList L);
void showlist(LinkList L);
LinkList L;
L=creattouchafa(L,5);
showlist(L);
L=nizhi( L);//这里的L需要注意,千万不要忘记,否则不会显示改动后的链表
showlist(L);

return 0;
}

int creattouchafa(LinkList L,int n)
{
/*单链表的创建函数,头插法*/
int i;
LinkList p;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
printf("please input data:\n");
for(i=n;i>0;i--)
{
p=(LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next=L->next;
L->next=p;
}
# if 0
for(i=n;i>0;i--)
{
/*检验单链表内所存取的数据,其中p=p->next这句挺关键*/
printf("%d ",p->data);
p=p->next;
}
# endif
return p;
}


/* 逆置函数,将单链表中的数据逆置*/
LinkList nizhi(LinkList L)
{
LinkList p,q,r;
/*
p=L;
q=r=NULL;
while(p)
{
q=p->next;
p->next=r;
r=p;
p=q;
}

return r;
*/

p=L;
q=p->next;
while (q!=NULL)
{
r=q->next;
q->next=p;
p=q;
q=r;
}
L->next =NULL;
L=p;
return L;
}


/*输出函数,输出单链表中的数据*/
void showlist(LinkList L)
{

LinkList p;
p=L->next;
printf("单链表中存储的数据为:\n");
printf("%d%s",L->data,"->");
while(p)
{

printf("%d%s",p->data,"->");
p=p->next;
}
printf("\n");


}

/*

每一步实现的过程:

0(初始化)、q为每一步运算的主要节点位置,初始化为第一个;
1、r=q的后续,把q的后续记录下来;
2、q-》next=p,把q的后续指向p(也就是开始),换句话说,把q放在了最开始;
3、p=q,把新的开始设置为新插入的q(下一次循环时,他就是p了);
4、q=r,把下一步要进行运算的主要节点设置为r,也就是当前运算节点的下个节点。

*/

相关文档
最新文档