#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct Node
{char data;
struct Node* next;
}linklist;
linklist *head,*p;
linklist *CREATLISTRO()//尾插法建立单链表
{
char ch;
linklist *head,*s,r;
head=NULL;
r=NULL;
printf("开始建立单链表输入$结束\n");
ch=getchar();
while(ch!='$')
{
s=(linklist)malloc(sizeof(linklist));
s->data=ch;
if(head==NULL)
head=s;
else
r->next=s;
r=s;
ch=getchar();
}
if(r!=NULL)
r->next=NULL;
return head;
}
///
//输出单链表/1
void ShowList(linklist *head)
{
linklist *p;
printf("输出单链表:"); p=head;
if(head->next==NULL)
printf("表为空\n");
else
while(p!=NULL)
{
printf(" %c ",p->data);
p=p->next;
}
printf("\n");
}
//求单链表长度//
void LENGTH(linklist *head)
//求长度
{
int n=0;
linklist p;
p=head;
if(head->next==NULL)
printf("表为空\n");
else
while(p->next!=NULL)
{
n++;
p=p->next;
}
printf("\n该单链表的长度为:%d\n",n+1);
}
void Reverse(linklist head)//链表转置
{
linklist *p1, *p2, *p3;
p1 = head->next;
p2 = p1->next;
p3 = p2->next;
head->next = NULL;
p1->next = NULL;
while (p3->next)
{
p2->next = p1;
p1 = p2;
p2 = p3;
p3 = p2->next;
}
p2->next = p1;
p3->next = p2;
head->next = p3;
}
int main()
{
head=CREATLISTRO();
ShowList(head);
LENGTH(head);
getchar();
Reverse(head);
ShowList(head);
return 0;
}
你可以去我的博客看一下我的逆置的写法
链表的逆置可以很简单,可以用到头插法,用一个结点s从链表头向后走,并将s按照头插法插到头节点后(头插法的性质就是最后加入的节点在最前面)