#include<stdio.h>
#include<malloc.h>
typedef char ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LinkNode;
void InitList(LinkNode *&L){
L=(LinkNode *)malloc(sizeof(LinkNode));
L->next=NULL;
}
void DestroyList(LinkNode *&L){
LinkNode *pre,*p;
pre=L,p=pre->next;
while(p!=NULL) {
free(pre);
pre=p;
p=pre->next;
}
free(pre);
}
bool ListEmpty(LinkNode *L){
return L->next==NULL;
}
int ListLength(LinkNode *L){
LinkNode *p=L->next;
int i=0;
while(p!=NULL) {
i++;
p=p->next;
}
return i;
}
bool ListInsert(LinkNode *&L,int i,ElemType e){
int j=0;
LinkNode *p=L,*s;
if(i<=0)
return false;
while(j<i-1&&p!=NULL){//查找第i-1个节点的位置
j++;
p=p->next;
}
if(p==NULL){
return false;
}
else{
s=(LinkNode *)malloc(sizeof(LinkNode ));//为插入的节点分配内存
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
}
void DispList(LinkNode *L){
LinkNode *p=L->next;
while(p!=NULL){
printf("%c ",p->data);
p=p->next;
}
printf("\n");
}
void ExchangeElem(LinkNode *&L,int i,int j){
/*思路:依次获取第i个位置和第j个位置的前驱节点和后继结点的信息
*/
int k=0;
int m=0;
LinkNode *ipre=L,*jpre=L,*p=L,*s=L;
while(s!=NULL&&k<i){
k++;
// ipre=p;
s=s->next;
}
//同理
p=L;
while(p!=NULL&&m<j){
m++;
//jpre=p;
p=p->next;
}
char t;
t=p->data;
p->data=s->data;
s->data=t;
}
void ReserveList(LinkNode *&L){
LinkNode *head2,*s;
head2=(LinkNode *)malloc(sizeof(LinkNode ));
LinkNode *p=L->next;
head2->next=NULL;
while(p!=NULL){//头插法
s=(LinkNode *) malloc(sizeof(LinkNode));
s->data=p->data;
s->next=head2->next;
head2->next=s;
p=p->next;
}
//变化头结点
L=head2;
}
int main(void){
LinkNode *head;
InitList(head) ;
printf("单链表的长度为%d\n",ListLength(head));
printf("初始化单链表,并依次插入a,b,c,d\n");
ListInsert(head,1,'a');
ListInsert(head,2,'b');
ListInsert(head,3,'c');
ListInsert(head,4,'d');
printf("输出单链表");
DispList(head);
printf("单链表的长度为%d\n",ListLength(head)) ;
printf("任意交换两个位置的元素:");
int a,b;
scanf("%d%d",&a,&b) ;
ExchangeElem(head,a,b);
printf("输出单链表:") ;
DispList(head);
printf("逆序输出单链表:");
ReserveList(head);
DispList(head);
}