c語言,順序空間遊標連結串列的實現
阿新 • • 發佈:2019-02-09
#include<stdio.h> #include<stdlib.h> #include<time.h> #define SpaceSize 1500/*記憶體池容量*/ #define _NormalMake_/*正常輸入元素,相對隨機而言*/ //#undef _NormalMake_ #define N 100 /*隨機元素個數*/ typedef int ElemType; typedef int PtrToNode; typedef PtrToNode List; typedef PtrToNode Pos; struct Node{ ElemType data; Pos next; } CurSpace[SpaceSize]; void ERROR(char *ch){ puts(ch); exit(0); } void InitCurSpace(){ for (int i = 0; i != SpaceSize; ++i){ CurSpace[i].next = i + 1; } CurSpace[SpaceSize - 1].next = 0; } static Pos CurMalloc(){ Pos p; p = CurSpace[0].next; if (0 == p) ERROR("Out of space!"); CurSpace[0].next = CurSpace[p].next; return p; } static void CurFree(Pos p){ CurSpace[p].next = CurSpace[0].next; CurSpace[0].next = p; } List MakeEmpty(){ List L; L = CurMalloc(); CurSpace[L].next = 0;/////////出過錯誤 return L; } int IsEmpty(List L){ return 0 == CurSpace[L].next; } int IsLast(Pos p){ return 0 == CurSpace[p].next; } Pos Find(ElemType e, List L){ Pos p; p = CurSpace[L].next; while (CurSpace[p].data != e&&p) p = CurSpace[p].next; return p; } Pos FindPre(ElemType e, List L){ Pos p; p = L;//出錯 while (!IsLast(p) && CurSpace[CurSpace[p].next].data != e) p = CurSpace[p].next; return p; } void DeleteElem(ElemType e, List L){ Pos p,TemCell; p = FindPre(e, L); if (!IsLast(p)){ TemCell = CurSpace[p].next; CurSpace[p].next = CurSpace[TemCell].next; CurFree(TemCell); } } void InsertElem(ElemType e, Pos p){ Pos TemCell; TemCell = CurMalloc(); CurSpace[TemCell].data = e; CurSpace[TemCell].next = CurSpace[p].next; CurSpace[p].next = TemCell; } void DeleteCurList(List L){ Pos p, TemCell; p = CurSpace[L].next; CurSpace[L].next = 0; while (p){ TemCell = CurSpace[p].next; CurFree(p); p = TemCell; } } void GetElemSeries(int array[N]){ srand((unsigned)time(NULL)); for (int i = 0; i != 100; ++i){ array[i] = rand() % 100; } } List MakeCurList(){ List L; Pos p; p=L = MakeEmpty(); #ifdef _NormalMake_ ElemType e; puts("請輸入表0結束:"); scanf("%d", &e); while (e){ InsertElem(e, p); p = CurSpace[p].next; scanf("%d", &e); } #else //int array[N]; int *array = malloc(sizeof(int)*N); GetElemSeries(array); for (int i = 0; i != N; i++){ InsertElem(array[i], p); p = CurSpace[p].next; } #endif return L;/// } void PrintCurList(List L){ Pos p; if (IsEmpty(L)) ERROR("\nEmpty List!"); p = CurSpace[L].next; puts("\n表如下"); while (p){ printf("%d ", CurSpace[p].data); p = CurSpace[p].next; } } void DeleteSerial(List L){ #ifdef _NormalMake_ ElemType e; puts("\n輸入刪除的元素0結束"); scanf("%d", &e); while (e){ DeleteElem(e, L); scanf("%d", &e); } #else int array[N]; GetElemSeries(array); for (int i = 0; i != N/2; i++){ DeleteElem(array[i], L); } #endif } int main(){ List L1,L2; InitCurSpace(); L1 = MakeCurList(); PrintCurList(L1); DeleteSerial(L1); PrintCurList(L1); DeleteCurList(L1); //PrintCurList(L1); L2 = MakeCurList(); PrintCurList(L2); DeleteSerial(L2); //PrintCurList(L1); PrintCurList(L2); DeleteCurList(L2); PrintCurList(L2); return 0; }/*全通過驗證無空間*/