#define DEBUG #include <stdio.h> #include <stdlib.h> #include <string.h> #include "include/myassert.h" typedef int State; #define OK 1 #define FAIL 0 typedef struct LNode{ int data; struct LNode * next; }LNode, *LinkList; State InitList (LNode ** L); State DestroyList (LNode ** L); State ClearList (LNode * L); State ListEmpty (LNode * L); int ListLength (LNode * L); State GetElem (LNode * L, int i, int * e); //State LocateElem (SqList * L, int e, compare); //State PriorElem (LNode * L, int cur_e, int * pre_e); //State NextElem (LNode * L, int cur_e, int * next_e); State ListInsert (LNode * L, int i, int e); State ListDelete (LNode * L, int i, int * e); State ListTraverse (LNode * L, void (*fun) (int)); void PrintElem (int Elem) { printf (" %d", Elem); } int main (void) { int i; int e; LinkList List = NULL; InitList (&List); for (i = 1; i <= 100; i++) ListInsert (List, i, 20 * i); ListTraverse (List, PrintElem); if (OK == GetElem (List, 2, &e)) printf ("Get elem:%d/n", e); if (OK == ListDelete(List, 2, &e)) printf ("Del elem %d success!/n", e); if (OK == ListDelete(List, 2, &e)) printf ("Del elem %d success!/n", e); ListTraverse (List, PrintElem); } State InitList (LNode ** L){ MYASSERT (NULL != L); LinkList q = NULL; *L = (LinkList)malloc(sizeof (LNode)); if (!*L) return FAIL; q = (LinkList) *L; q->next = NULL; q->data = 255; return OK; } State DestroyList (LNode ** L){ MYASSERT (NULL != L); ClearList (*L); free(*L); *L = NULL; return OK; } State ClearList (LNode * L){ MYASSERT (NULL != L); LinkList q; q = L->next; while (q){ L->next = q->next; free(q); q = L->next; } return OK; } State ListEmpty (LNode * L){ ClearList (L); return OK; } int ListLength (LNode * L){ LNode * p; MYASSERT (NULL != L); int i = 0; for (p = L->next; p != NULL; p = p->next){ i++; } return i; } State GetElem (LNode * L, int pos, int * e){ LNode * p; int j = 0; MYASSERT (NULL != L && NULL != e); if (pos < 1) return FAIL; p = L; while (NULL != p && j < pos){ p = p->next; ++j; } if (!p) return FAIL; *e = p->data; return OK; } //State LocateElem (SqList * L, int e, compare); //State PriorElem (LNode * L, int cur_e, int * pre_e); //State NextElem (LNode * L, int cur_e, int * next_e); State ListInsert (LNode * L, int pos, int e){ LinkList p; LinkList n; int j = 0; MYASSERT (NULL != L); if (pos < 1){ // Insert position error! return FAIL; } p = L; while (NULL != p && j < pos - 1){ p = p->next; ++j; } if (!p) return FAIL; n = (LinkList)malloc(sizeof(LNode)); n->data = e; n->next = p->next; p->next = n; return OK; } State ListDelete (LNode * L, int pos, int * e){ LNode * p; LNode * q; int j = 0; MYASSERT (NULL != L && NULL != e); p = L; while (p->next && j < pos -1){ p = p->next; ++j; } if (!(p->next) || j > pos - 1) return FAIL; q = p->next; p->next = q->next; *e = q->data; free (q); return OK; } State ListTraverse (LNode * L, void (*fun) (int)){ LinkList p; LinkList q; MYASSERT(NULL != L); for (p = L; p != NULL; p = p->next){ fun(p->data); } return OK; }