试写一算法,对单链表实现就地逆置。
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
typedef char Status;
typedef char ElemType;
//链表结构体、指向链表的指针
typedef struct LNode
{
ElemType data;
struct LNode *next;
} LNode,*LinkList;
Status InitList(LinkList &L);
Status CreatList(LinkList &L, int n, ElemType Data[]);
void OutputL(LinkList &L);
LinkList ReverseL(LinkList &L);
int main()
{
LinkList L;
ElemType a[13] = {"123ABCxyz086"};
InitList(L);
CreatList(L,13,a);
OutputL(L);//输出原表
LinkList newL = ReverseL(L);
printf("\n逆置后:");
OutputL(newL);
return 0;
}
//初始化单链表
Status InitList(LinkList &L)
{
L=(LinkList)malloc(sizeof(LNode)); /*产生头结点,并使L指向此头结点*/
if(!(L))
return ERROR;
(L)->next=NULL;
return OK;
}
//尾插法创建单链表
Status CreatList(LinkList &L,int n,ElemType Data[])
{
LinkList s,r;
int i;
if(!L || L->next)
return ERROR;
for(i=0, r=L; i<n; i++)
{
s=(LinkList)malloc(sizeof(LNode));
if(!s)
return ERROR;
s->data =Data[i];
s->next = r->next;
r->next = s; /*将尾结点的指针指向新结点 */
r = r->next; /*将当前的新结点定义为新的尾结点*/
}
return OK;
}
//输出单链表
void OutputL(LinkList &L)
{
LinkList p;
printf("原表:\n");
if(L)
{
p=L->next;
while(p)
{
printf("%c ",p->data );
p=p->next;
}
}
}
//单链表就地逆转
LinkList ReverseL(LinkList &L)
{
LinkList p=NULL,q=NULL;
p=L;
q=L->next;
while(q!=NULL)
{
p->next=q->next;
q->next=L;
L=q;
q=p->next;
}
p=NULL;
return L;
}