单链表交换节点排序,包括选择法、比较法、排序法。
用C实现代码如下:
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define ERROR 0
#define OVERFLOW 0
#define OK 1
typedef int Status;
typedef int ElemType;
struct LNode
{
ElemType data;
struct LNode *next;
};
typedef struct LNode LinkList;
LinkList *InitList(LinkList *L);/*初始化一个链表*/
void DestoryList(LinkList *L);/*销假链表*/
void ClearList(LinkList *L);/*清空链表 */
Status ListEmpty(LinkList *L);/*判断链表是否为空 */
int ListLength(LinkList *L);/*返回表的长度 */
Status GetElem(LinkList *L,int i,ElemType *e);/*返回第i个元素的值 */
int LocateElem(LinkList *L,ElemType e,Status(*compare)(ElemType));/*返回L中第1个与e满足关系compare()的数据元素的位序*/
Status PriorElem(LinkList *L,ElemType cur_e,ElemType *pre_e);/*返回前驱的值 */
Status NextElem(LinkList *L,ElemType cur_e,ElemType *next_e);/*返回后继的值*/
Status ListInsert(LinkList *L,int i,ElemType e);/*在带头结点的单链表中第i个位置之前插入元素e*/
Status ListDelete(LinkList *L,int i,ElemType *e);/*在带头结点的单链表中,删除第1个元素,用e返回其值勤*/
void ListTraverse(LinkList *L,void(*visit)(ElemType));/*依次对L的每个元素调用函数visit() */
void print(ElemType e);
Status equal(ElemType c1,ElemType c2);
void Listprint(LinkList *L);
void Merge(LinkList *La,LinkList *Lb);/*两个集合的交集 */
void Merge1(LinkList *La,LinkList *Lb);/*利用函数实现集合的交集*/
/*void Differ(LinkList La,LinkList Lb); *//*两个集合的差集 */
void Union1(LinkList *La,LinkList *Lb);/*利用函数实现集合的并集 */
void Differ(LinkList *La,LinkList *Lb);/*利用函数实现集合的差集 */
LinkList *InitList(LinkList *L)/*构造一个空链链表*/
{
L=(LinkList*)malloc(sizeof(LinkList));/*产生头结点,并使L指向此头结点*/
if(L==NULL) exit(OVERFLOW);
L->next=NULL;
return L;
}
void DestroyList(LinkList *L)/*销毁L*/
{
LinkList *q;
while(L!=NULL)/*L指向结点*/
{
q=L->next;/*q指向首元结点*/
free(L);
L=q;/*L指向原首结点*/
}
}
void ClearList(LinkList *L)
{ /*将表清空 */
LinkList *p=L->next;
L->next=NULL;
DestroyList(p);/*销毁P所指向的单链表 */
}
Status ListEmpty(LinkList *L)
{ /*表为空则返回TRUE,否则返回FALSE */
if(L->next!=NULL) return FALSE;
else return TRUE;
}
int ListLength(LinkList *L)
{/*返回表中的元素的个数*/
int i=0;
LinkList *p=L->next;/*P指向第一个结点*/
while(p!=NULL)/*未到表尾*/
{
i++;
p=p->next;
}
return i;
}
Status GetElem(LinkList *L,int i,ElemType *e)/*当第i个元素存在时,将其值赋给e */
{
int j=1;/*计数器初值为1*/
LinkList *p=L->next;/*p指向第一个结点*/
while((p!=NULL)&&(j<i))/*顺指针向后查找,直到找到p指向第i个结点*/
{
j++;
p=p->next;
}
if((p==NULL)||(j>i)) return ERROR;/*p==NULL说明L中节点数目小于i,若j>i成立,则必有i<1时,i越界*/
(*e)=p->data;
return OK;
}
int LocatElem(LinkList *L,ElemType e,Status(*compare)(ElemType,ElemType))
{ /*返回表中第1个数据域与e满足关系compare()的数据关系的节点的位序 */
int i=0;/*计数器初值为0 */
LinkList *p=L->next;
while(p!=NULL)/*未到表尾 */
{
i++;
if(compare(p->data,e))/*找到这样的元素*/
return i;/*返回其位序*/
p=p->next;
}
return 0;/*不存在相应节点*/
}
Status PriorElem(LinkList *L,ElemType cur_e,ElemType *pre_e)
{ /*返回前驱 */
LinkList *q,*p=L->next;/*p指向第一个元素*/
while(p->next!=NULL)/*p指的结点有后继 */
{
q=p->next;/*q指向p的后继 */
if(q->data==cur_e)/*p的后继为cur_e */
{
(*pre_e)=p->data;
return OK;
}
p=q;/*p的后继不为cur_e,向后移*/
}
return ERROR;
}
Status NextElem(LinkList *L,ElemType cur_e,ElemType *next_e)
{ /*返回后继 */
LinkList *p=L->next;
while(p->next!=NULL)/*p所指结点的后继 */
{
if(p->data==cur_e)
{
(*next_e)=p->next->data;
return OK;
}
p=p->next;
}
return ERROR;
}
Status ListInsert(LinkList *L,int i,ElemType e)
{
/*在第i个位置之前插入元素e */
int j=0;/*计数器初值为0*/
LinkList *s,*p=L;/*p指向头结点*/
while((p!=NULL)&&(j<i-1))/*寻找第i个结点*/
{
j++;
p=p->next;
}
if((p==NULL)||(j>i-1)) return ERROR;/*p==NULL说明L中节点数目小于i,若j>i成立,则必有i<1时,i越界*/
s=(LinkList*)malloc(sizeof(LinkList));/*生成新的结点*/
s->data=e;
s->next=p->next;/*新结点指向原第i个结点*/
p->next=s;/*原第i-1个结点指向新结点*/
return OK;
}
Status ListDelete(LinkList *L,int i,ElemType *e)
{/*在带头结点的单链表中删除第i个元素,并用e返回其值*/
int j=0;/*计数器初值为0*/
LinkList *q,*p=L;/*p指向头结点*/
while((p->next!=NULL)&&(j<i-1))/*寻找第i个结点,并用p指向其前驱*/
{
j++;
p=p->next;
}
if((p->next==NULL)||(j>i-1)) return ERROR;/*p->next==NULL说明L中节点数目小于i,若j>i成立,则必有i<1时,i越界*/
q=p->next;
p->next=q->next;
(*e)=q->data;
free(q);
return OK;
}
void ListTreaverse(LinkList *L,void(* visit)(ElemType))
{/*依次对L的每个数据元素调用函数visit()*/
LinkList *p=L->next;/*p指向第一个元素 */
while(p)
{
visit(p->data);
p=p->next;
}
printf("\n");
}
Status equal(ElemType c1,ElemType c2)
{ /*判断两个数是否相等 */
if(c1==c2)
return TRUE;
else
return FALSE;
}
void print(ElemType e)
{
printf("%d",e);
}
void Listprint(LinkList *L)/*输出单链表*/
{
LinkList *p=L->next;
while(p!=NULL)
{
printf("%d",p->data);
p=p->next;
}
printf("\n");
}
void Merge(LinkList *La,LinkList *Lb)/*两个集合的交集*//*存在错误小缺陷,,重复元素的问题*/
{
LinkList *pa,*pb;
/*pa=La->next; */
/*pb=Lb->next;*/
for(pa=La;pa->next!=NULL;pa=pa->next)
for(pb=Lb->next;pb->next!=NULL;pb=pb->next)
{
if(pa->data==pb->data)
printf("%d",pa->data);
}
}
void Merge1(LinkList *La,LinkList *Lb)/*利用函数实现集合的交集*/
{
ElemType e=0;
int La_len,Lb_len;
int i;
La_len=ListLength(La);
Lb_len=ListLength(Lb);
for(i=1;i<=Lb_len;i++)
{
GetElem(Lb,i,&e);
if(LocatElem(La,e,equal))
printf("%d",e);
}
}
void Union1(LinkList *La,LinkList *Lb)/*利用函数实现集合的并集*/
{
ElemType e=0;
int La_len,Lb_len;
int i;
La_len=ListLength(La);
Lb_len=ListLength(Lb);
for(i=1;i<=Lb_len;i++)
{
GetElem(Lb,i,&e);/*取表中第i个元素赋给e */
if(LocatElem(La,e,equal)==0)/*表La中不存在和e相同的元素*/
ListInsert(La,++La_len,e);/*在表la中插入元素e */
}
Listprint(La);
}
void Differ(LinkList *La,LinkList* Lb)/*利用函数实现集合的差集 */
{
ElemType e=0;
int La_len,Lb_len;
int i;
La_len=ListLength(La);
Lb_len=ListLength(Lb);
for(i=1;i<=La_len;i++)
{
GetElem(La,i,&e);/*取表中第i个元素赋给e */
if(LocatElem(Lb,e,equal)==0)/*表Lb中不存在这样的元素 */
printf("%d",e);
}
}
void main()
{
LinkList *L,*La,*Lb;
int i=0,k=0,j=0,e1=0,e=0;
L=NULL;
La=NULL;
Lb=NULL;
L=(LinkList*)malloc(sizeof(LinkList));
L=InitList(L);/*初始化链表 */
k=ListEmpty(L);
printf("L为空表?k=%d(k=1,是;k=0,否)",k);
printf("\n");
for(i=1;i<=5;i++)
ListInsert(L,1,i);
printf("线性表为L=");
/*ListTraverse(L,print);*/
Listprint(L);
printf("\n表的长度为%d\n",ListLength(L));
/*删除元素 */
k=ListDelete(L,3,&e);
if(k==ERROR)
printf("删除不成功");
else
printf("删除元素成功,其值为%d",e);
printf("\n");
/*判断表是否为空 */
k=ListEmpty(L);
printf("L为空表?k=%d(k=1,是;k=0,否)",k);
printf("\n");
/*清空表后*/
ClearList(L);/*清空表 */
printf("表清空后长度为%d",ListLength(L));
Listprint(L);
/*再次判断表是否为空*/
k=ListEmpty(L);
printf("L为空表?k=%d(k=1,是;k=0,否)",k);
printf("\n");
for(j=1;j<=10;j++)
ListInsert(L,j,j);/*在L的表尾插入j */
printf("重新插入元素之后表变为:");
Listprint(L);
/*判断前驱*/
for(j=1;j<=ListLength(L);j++)
{
GetElem(L,j,&e);/*把L中第j个元素赋给e */
k=PriorElem(L,e,&e1);/*求e的前驱,并赋给e1*/
if(k==ERROR)
printf("元素%d无前驱\n",e);
else
printf("元素%d的前驱为%d\n",e,e1);
}
printf("\n");
/*判断后继*/
for(j=1;j<=ListLength(L);j++)
{
GetElem(L,j,&e);/*把L中第j个元素赋给e*/
k=NextElem(L,e,&e1);/*求e的前驱,并赋给e */
if(k==ERROR)
printf("元素%d无后继\n",e);
else
printf("元素%d的后继为%d\n",e,e1);
}
/*两个单链表的操作*/
La=InitList(La);
for(i=1;i<=5;i++)
ListInsert(La,i,i);
printf("单链表La:");
Listprint(La);
printf("\n");
Lb=InitList(Lb);
for(i=1;i<=5;i++)
ListInsert(Lb,i,2*i);
printf("单链表Lb:");
Listprint(Lb);
printf("\n");
/*两个集合的交集*/
printf("两个集合的交集:");
Merge(La,Lb);
printf("\n");
/*利用函数实现集合的交集 */
printf("利用函数实现集合的交集:");
Merge1(La,Lb);
printf("\n");
/*两个集合的差集 */
printf("利用函数实现集合的差集La-Lb:");
Differ(La,Lb);
printf("\n");
/*两个集合的并集*/
printf("两个集合的并集:");
Union1(La,Lb);
getch();
}