一个根据数据结构教材实现的线性表。 myassert.h #ifndef __MYASSERT_H__ #define __MYASSERT_H__ #ifdef DEBUG void _Assert(char* , unsigned); #define MYASSERT(f) / if(f) NULL; / else _Assert(__FILE__ , __LINE__) #else #define MYASSERT(f) NULL #endif void _Assert(char* strFile, unsigned uLine) { fflush(stdout); fprintf(stderr, "/nAssertion failed: %s, line %u/n",strFile,uLine); fflush(stderr); abort(); } #endif main.c #define DEBUG #include <stdio.h> #include <stdlib.h> #include <string.h> #include "include/myassert.h" #include "sys/timeb.h" #define MAXSIZE 100 #define OK 1 #define FAIL 0 typedef int State; typedef struct { int elem[MAXSIZE]; int length; }SqList; State InitList (SqList * L); State DestroyList (SqList * L); State ClearList (SqList * L); State ListEmpty (SqList * L); int ListLength (SqList * L); State GetElem (SqList * L, int i, int * e); //State LocateElem (SqList * L, int e, compare); State PriorElem (SqList * L, int cur_e, int * pre_e); State NextElem (SqList * L, int cur_e, int * next_e); State ListInsert (SqList * L, int i, int e); State ListDelete (SqList * L, int i, int * e); State ListTraverse (SqList * L, void (*fun) (int)); void PrintElem (int Elem) { printf (" %d", Elem); } int main (void) { int i; int e; timeb t1, t2; long t; SqList List; InitList (&List); for (i = 1; i <= 100; i++) ListInsert (&List, i, 20 * i); ListTraverse (&List, PrintElem); if (OK == PriorElem (&List, 2000, &e)) { printf ("/nPrior e:%d/n", e); } if (OK == NextElem (&List, 20, &e)) { printf ("/nNext e:%d/n", e); } } State InitList (SqList * L) { MYASSERT (NULL != L); memset (L, 0, sizeof (SqList)); L->length = 0; return OK; } State DestroyList (SqList * L) { MYASSERT (NULL != L); return InitList (L); } State ClearList (SqList * L) { MYASSERT (NULL != L); return InitList (L); } State ListEmpty (SqList * L) { MYASSERT (NULL != L); return InitList (L); } int ListLength (SqList * L) { MYASSERT (NULL != L); return L->length; } State GetElem (SqList * L, int i, int * e) { MYASSERT (NULL != L); MYASSERT (NULL != e); if (i >= 1 && i <= ListLength(L)) { *e = L->elem[i - 1]; return OK; } return FAIL; } //State LocateElem (SqList * L, int e, compare); State PriorElem (SqList * L, int cur_e, int * pre_e) { int i; MYASSERT (NULL != L); MYASSERT (NULL != pre_e); for (i = 0; i < L->length; i++) { if (cur_e == L->elem[i] && i >= 1) { *pre_e = L->elem[i - 1]; return OK; } } return FAIL; } State NextElem (SqList * L, int cur_e, int * next_e) { int i; MYASSERT (NULL != L); MYASSERT (NULL != next_e); for (i = 0; i < L->length; i++) { if (cur_e == L->elem[i] && i < L->length - 1) { *next_e = L->elem[i + 1]; return OK; } } return FAIL; } State ListInsert (SqList * L, int i, int e) { int * p; int * q; MYASSERT (NULL != L); if (i < 1 || i > L->length + 1) return FAIL; if (L->length >= MAXSIZE) return FAIL; q = &(L->elem[i - 1]); for (p = &(L->elem[L->length -1]); p >= q; --p) *(p + 1) = *p; *q = e; ++L->length; return OK; } State ListDelete (SqList * L, int i, int * e) { int *p; int *q; MYASSERT (NULL != L); MYASSERT (NULL != e); if (i < 1 || i > L->length) return FAIL; p = &(L->elem[i - 1]); *e = *p; q = L->elem + L->length - 1; for (++p; p <= q; ++p) *(p - 1) = *p; --L->length; return OK; } State ListTraverse (SqList * L, void (*fun) (int)) { int i; MYASSERT (NULL != L); MYASSERT (NULL != fun); printf ("List Length:%d/n", L->length); for (i = 0; i < L->length; i++) { fun (L->elem[i]); } }