其实网上有很多这个代码 但俺是初学者 理解别人的代码挺晦涩的 感觉这反转的道理挺简单的 还是想自己按照自己的想法敲一遍看看 第一次失败的原因是忽略了指向头结点自身的指针是不能改变的
//WinXP VC6
//WinXP VC6
#include<stdio.h>
#include<malloc.h>
typedef char ElemType;
typedef struct Node{
ElemType data;
struct Node *next;
}SLink;
void InitLink(SLink *&Head) //单链表初始化,创建指向NULL的头结点
{
Head = (SLink *)malloc(sizeof(SLink));
Head->next = NULL;
}
int GetLength(SLink *Head) //获得链表长度(除了头结点的结点个数)
{
int i=0;
SLink *p = Head->next;
while(NULL != p)
{
p = p->next;
i++;
}
return i;
}
bool InsertNode(SLink *Head,int i,ElemType dt) //在第i个位置(从1开始)插入结点(数据为dt)
{
int j=1;
SLink *p = Head;
if(i<1 || i>GetLength(Head)+1)
return false;
SLink *newNode = (SLink *)malloc(sizeof(SLink));
newNode->next = NULL;
newNode->data = dt;
while(j<i)
{
p = p->next;
j++;
}
newNode->next = p->next;
p->next = newNode;
return true;
}
bool Reverse(SLink *&Head)
{
if(NULL == Head->next)
return false;
SLink *pre = Head->next;
if (NULL == pre->next) //至少有不包括头结点的两个有效结点才进行反转
{
return false;
}
SLink *cur = pre->next,*tmp;
pre->next = NULL;
while(NULL != cur)
{
tmp = cur->next;
cur->next = pre;
pre = cur;
cur = tmp;
}
Head->next = pre; //改变头结点指向的首结点地址
return true;
}
void Display(SLink *Head)
{
SLink *p = Head->next;
while(NULL != p)
{
printf(" %c ",p->data);
p = p->next;
}
printf("\n");
}
int main()
{
SLink *L;
InitLink(L);
for(int i=1; i<10; i++)
{
InsertNode(L,i,'A'+i-1);
}
Display(L);
Reverse(L);
printf("After Reverse the link is:\n");
Display(L);
return 0;
}