单链表的实现
首先,需要定义一个链表的结构体
1 struct Node 2 { 3 ElementType Element; 4 Position Next; 5 };
然后,你可能还需要这样定义几个别名,方便后面使用。
typedef struct Node *PtrToNode; typedef int ElementType;//这样是为了结点结构体更通用,只需改变这里的int,就可以将结点元素改成其他数据类型。 typedef PtrToNode List; typedef PtrToNode Position;
常用的链表操作:
int IsEmpty( List L ) { return L->Next == NULL ;//因为L是头结点,如果头结点的next指向空,说明没有结点。 } /*判断当前节点是否是最后一个结点*/ int IsLast( Position P, List L) { return P->Next == NULL;//假设这个元素是存在的,如果没有指向下一个结点,那么它就是最后一个 } /*在链表中找出元素位X的结点*/ Position Find( ElementType X, List L ) { Position P; P = L->Next; while(P != NULL && P->Element != X) P = P->Next; return P;//当返回P时有两种情况,一是找到了,返回此结点,二是当检查到结尾也没找到时,返回NULL。 } /*找到元素为X的结点前面一个结点*/ Position FindPrevious( ElementType X, List L ) { Position P; P = L; while(P->Next != NULL && P->Next->Element != X) P = P->Next; return P;//如果最后没找到,那么返回的P的next是空。 } /*删除元素为X的结点*/ void Delete( ElementType X, List L ) { Position P,Tmp; P = FindPrevious(X,L); if(P->Next != NULL) { Tmp = P->Next; P->Next = Tmp->Next;//让X之前的结点的next指向X的下一个结点,再free掉X这个结点。 free(Tmp); } } /*删除所有节点,只剩头结点*/ List MakeEmpty( List L ) { Position P; while((P = L->Next) != NULL) { L->Next = P->Next; free(P); } } /*在链表中位置P前面插入一个元素为X的结点*/ void Insert( ElementType X, List L, Position P ) { Position Pre,behind; Pre = L; while( Pre->Next != NULL && Pre->Next != P )//找到P前一个结点 Pre = Pre->Next; if(Pre->Next == NULL)//如果没有P结点,那么就把X放在链表的最后 { Pre->Next = P; P->Element = X; P->Next = NULL; } else if(Pre->Next == P) { behind = (Position)malloc(sizeof(struct Node));//如果找到P结点,先为新结点申请一块内存 behind->Element = P->Element;//把新节点放在P后面,然后把P的值放到新节点,把X放到原来的P结点。 behind->Next = P->Next; P->Element = X; P->Next = behind; } } /*删除链表*/ void DeleteList( List L ) { Position P; while((P = L->Next) != NULL) { L->Next = P->Next; free(P); } free(L); }

浙公网安备 33010602011771号