c语⾔单链表交换节点排序,单链表排序交换节点算法
单链表交换节点排序,包括选择法、⽐较法、排序法。
⽤C实现代码如下:
#include
#include
#include
#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
{
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)
{
c语言listinsert函数/*在第i个位置之前插⼊元素e */
int j=0;/*计数器初值为0*/
LinkList *s,*p=L;/*p指向头结点*/
while((p!=NULL)&&(j
{
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
{
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)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论