表指针实现。第二种方法是使用访问列表,模拟指针。
在我的理解中学习,它是创建一个节点数组,模拟存储装置,然后从中分配内存和释放内存。
但实际的内存没有被释放~
下面的代码直接附着:
// // main.cpp // CursorList // // Created by Alps on 14-7-27. // Copyright (c) 2014年 chen. All rights reserved. // #include <iostream> #define CursorSpace 100 #define ElementType int using namespace std; typedef int PtrToNode; typedef PtrToNode List; typedef PtrToNode Position; void InitializeCursorList(void); List MakeEmpty(List L); int isEmpty(List L); int isLast(List L, Position P); void Insert(List L, Position P, ElementType X); void Delete(List L, ElementType X); Position Find(List L, ElementType X); Position FindPrevious(List L, ElementType X); void DeleteList(List L); struct Node{ ElementType X; Position Next; }; struct Node CursorList[CursorSpace]; int isEmpty(List L){ return CursorList[L].Next == 0; } int isLast(List L, Position P){ return CursorList[P].Next == 0; } void InitializeCursorList(void){ int i = 0; for (i = 0; i < CursorSpace; i++) { CursorList[i].Next = i + 1; } CursorList[CursorSpace - 1].Next = 0; } Position CursorAlloc(){ Position P; P = CursorList[0].Next; CursorList[0].Next = CursorList[P].Next; CursorList[P].Next = 0; return P; } void CursorFree(Position P){ CursorList[P].Next = CursorList[0].Next; CursorList[0].Next = P; } Position Find(List L, ElementType X){ Position P = CursorList[L].Next; while (CursorList[P].X != X && P) { P = CursorList[P].Next; } if (P == 0) { return false; } return P; } Position FindPrevious(List L, ElementType X){ Position P = L; Position tmp = CursorList[P].Next; while (CursorList[tmp].X != X && tmp) { tmp = CursorList[tmp].Next; P = CursorList[P].Next; } return P; } void Delete(List L, ElementType X){ Position P = FindPrevious(L, X); Position tmp = CursorList[P].Next; CursorList[P].Next = CursorList[tmp].Next; } void Insert(List L, Position P, ElementType X){ Position tmp; tmp = CursorAlloc(); CursorList[tmp].X = X; CursorList[tmp].Next = CursorList[P].Next; CursorList[P].Next = tmp; } void DeleteList(List L){ Position P = CursorList[L].Next; Position tmp = P; while (tmp != 0) { P = CursorList[P].Next; CursorFree(tmp); if (P == 0) { break; } tmp = P; } CursorList[L].Next = 0; } void Print(List L){ Position P = CursorList[L].Next; while (P != 0) { printf("%d ",CursorList[P].X); P = CursorList[P].Next; } printf(" "); } int main(int argc, const char * argv[]) { printf("start ... "); InitializeCursorList(); List L = CursorAlloc(); Insert(L, L, 1); Insert(L, L, 3); Insert(L, L, 5); Insert(L, L, 4); Print(L); Position P = FindPrevious(L, 3); printf("%d ",P); Delete(L, 3); Print(L); DeleteList(L); Print(L); return 0; }
算法是没有问题。之后,我每一个功能考完试~
有任何疑问,请留言~