java单链表交换相邻元素_单链表的基本操作---插入,删除,交,并,相邻元素的交换等...

本文介绍了如何使用C语言实现Java单链表的基本操作,包括初始化、删除、查找、插入、删除元素、交换相邻元素、求交集、并集以及链表反转。提供了一系列关键函数如`MakeEmpty`、`DeleteList`、`Insert`、`Delete`、`SwapWithNext`等的详细实现。
摘要由CSDN通过智能技术生成

//引用头文件

#include "list.h"#include#include"fatal.h"

//结构体定义

structNode

{

ElementType Element;

Position Next;

};//初始化链表

List MakeEmpty(List L)

{if (L !=NULL)

DeleteList(L);//如果链表非空,则删除链表

L = malloc(sizeof(structNode));if (L ==NULL)

FatalError("Out of memory!");

L->Next =NULL;returnL;

}//删除链表

voidDeleteList(List L)

{

Position P, Temp;

P= L->Next;

L->Next =NULL;while (P !=NULL)

{

Temp= P->Next;free(P);

P=Temp;

}

}//判断链表是否为空

boolIsEmpty(List L)

{return L->Next==NULL;

}//判断当前指针P是否指向链表最后一个元素

boolIsLast(Position P, List L)

{return P->Next==NULL;

}//return Position of X in L;NULL if not found

Position Find(ElementType X, List L)

{

Position P;

P= L->Next;while (P != NULL && P->Element !=X)

P= P->Next;returnP;

}//删除链表中的元素X,若返回NULL,说明在链表中没找到元素X

voidDelete(ElementType X, List L)

{

Position P, TempCell;

P=FindPrevious(X, L);if (!IsLast(P, L))//当P不是尾针,说明找到了

{

TempCell= P->Next;

P->Next = TempCell->Next;free(TempCell);

TempCell=NULL;

}

}//如果返回的P指向最后一个元素,说明没有找到,1==IsLast(P,L)

Position FindPrevious(ElementType X, List L)

{

Position P;

P=L;while (P->Next != NULL&&P->Next->Element !=X)

P= P->Next;returnP;

}//插入元素X到位置P后面

voidInsert(ElementType X, List L, Position P)

{

Position TmpCell;

TmpCell= malloc(sizeof(structNode));if (TmpCell ==NULL)

FatalError("Out of Space!!!");

TmpCell->Element =X;

TmpCell->Next = P->Next;

P->Next =TmpCell;

}//获取链表头

Position Header(List L)

{returnL;

}//获取链表第一个元素的位置

Position First(List L)

{return L->Next;

}//获取位置P的下一个位置

Position Advance(Position P)

{return P->Next;

}//提取位置P处结构里面的值

ElementType Retrieve(Position P)

{return P->Element;

}//打印链表

void PrintList(constList L)

{

Position P=Header(L);if(IsEmpty(L))

printf("Empty list\n");else{do{

P=Advance(P);

printf("%d", Retrieve(P));

}while (!IsLast(P, L));

printf("\n");

}

}//打印链表L中那些由P所指定的位置上的元素。例如P=1,3,4,6,将L//中的第1,第3,第4,第6个元素打印出来

voidPrintLots(List L, List P)

{int count = 1;

Position Lpos, Ppos;

Lpos=First(L);

Ppos=First(P);while (Lpos != NULL&&Ppos !=NULL)

{if ( Ppos->Element == count++)

{

printf("%d", Ppos->Element);

Ppos=Advance(Ppos);

}

Lpos=Advance(Lpos);

}

}//通过只调整指针来交换两个相邻的元素,BeforeP是要调换两个元素的前一//个指针

voidSwapWithNext(Position BeforeP, List L)

{

Position P, AfterP;if (BeforeP !=NULL)

{

P=Advance(BeforeP);if (P !=NULL)

{

AfterP=Advance(P);if (AfterP !=NULL)

{

P->Next = AfterP->Next;

BeforeP->Next =AfterP;

AfterP->Next =P;

}

}

}

}//求两个链表的交集

List IntersectList(List L1, List L2)

{

List ResultList;

Position L1Pos, L2Pos, ResultPos;

ResultList=MakeEmpty(NULL);

L1Pos=First(L1);

L2Pos=First(L2);

ResultPos=Header(ResultList);while (L1Pos!=NULL&&L2Pos!=NULL)

{if (L1Pos->Element < L2Pos->Element)

L1Pos=Advance(L1Pos);else if (L1Pos->Element > L2Pos->Element)

L2Pos=Advance(L2Pos);else{

Insert(L1Pos->Element, ResultList, ResultPos);

ResultPos=Advance(ResultPos);

L1Pos=Advance(L1Pos);

L2Pos=Advance(L2Pos);

}

}returnResultList;

}//求两个链表的并集

List UnionList(Position L1, Position L2)

{

List ResultList;

ElementType InsertElement;

Position L1Pos, L2Pos, ResultPos;

ResultList=MakeEmpty(NULL);

L1Pos=First(L1);

L2Pos=First(L2);

ResultPos=Header(ResultList);while (L1Pos != NULL&&L2Pos !=NULL)

{if (L1Pos->Element < L2Pos->Element)

{

InsertElement= L1Pos->Element;

L1Pos=Advance(L1Pos);

}else if (L1Pos->Element > L2Pos->Element)

{

InsertElement= L2Pos->Element;

L2Pos=Advance(L2Pos);

}else{

InsertElement= L1Pos->Element;

L1Pos=Advance(L1Pos);

L2Pos=Advance(L2Pos);

}

Insert(InsertElement, ResultList, ResultPos);

ResultPos=Advance(ResultPos);

}while (L1Pos !=NULL)

{

Insert(L1Pos->Element, ResultList, ResultPos);

ResultPos=Advance(ResultPos);

L1Pos=Advance(L1Pos);

}while (L2Pos !=NULL)

{

Insert(L2Pos->Element, ResultList, ResultPos);

ResultPos=Advance(ResultPos);

L2Pos=Advance(L2Pos);

}returnResultList;

}//将链表以O(N)进行反转链表

voidReverseList(List L)

{if (IsEmpty(L)||L->Next->Next==NULL)//如果链表是空或者只有一个元素,则不排序

return;

Position CurrentPos, PreviousPos, NextPos;

CurrentPos= L->Next;//当前指针

PreviousPos = NULL;//上一个指针

NextPos = L->Next->Next;//探测指针

while (NextPos!=NULL)//探测指针指向链表尾部时,停止循环

{

CurrentPos->Next = PreviousPos;//当前指针指向指向上一个指针

PreviousPos = CurrentPos;//将上一个指针后移

CurrentPos = NextPos;//将当前指针后移

NextPos = Advance(NextPos);//将探测指针后移,直到触到尾指针NULL

}

CurrentPos->Next = PreviousPos;//最后一个指针还没有链接前一个指针

L->Next = CurrentPos;//将头结点链接原来尾节点

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值