11.21-本文实现的相邻结点交换-
本文注释均为我在写代码途中遇到的问题
//本文实现单链表的相邻结点交换
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int data;
struct node* next;
}Lnode,*Linklist;
//使用尾插法建立单链表
Linklist creat()
{
Linklist L,s;
Lnode* p;
int e;
L=(Linklist)malloc(sizeof(Lnode));
L->next=NULL;
s=L;//这一步一定要在L申请到了再进行将L的位置赋给S,不然会出现野指针
// printf("L的起始位置为%d\n",L);
while(1)
{
printf("请输入要建立的元素\n");
scanf("%d",&e);
if(e!=9999)
{
p=(Linklist)malloc(sizeof(Lnode));
p->next=s->next;
s->next=p;
p->data=e;
s=p;
}
else{
break;
}
}
// printf("L的输出位置为%d\n",L);
return L;
}
int length(Linklist L)
{
int count=0;
while(L!=NULL)
{
count++;
L=L->next;
}
//printf("count=%d\n",count-1);
return count-1;
}
Linklist revser(Linklist L)
{
Linklist q;
q=L;
q=q->next;//从第一个结点开始
int temp=0;
int sum=0;
sum=length(L);//求得长度
if(sum%2==0)
{
while(q!=NULL)
{
temp=q->data;
q->data=q->next->data;
q->next->data=temp;
q=q->next->next;
}
}
else{
while(q->next!=NULL)
{
temp=q->data;
q->data=q->next->data;
q->next->data=temp;
q=q->next->next;
}
}
return L;
}
void aprint(Linklist L)
{
L=L->next;
printf("\n当前元素为:\n");
while(L!=NULL)
{
printf("%d",L->data);
L=L->next;
}
}
int main(){
Linklist s;
s=creat();
int sum;
// printf("s=%d",s);
sum=length(s);//求出当前长度
printf("当前单链表的长度为:%d\n",sum);
aprint(s);//打印当前列表
revser(s);//交换相邻结点
aprint(s);//打印相邻结点交换之后的单链表
return 0;
}