根据严蔚敏写的数据结构这本书,用C语言实现,在VC6.0编译通过。 #include <stdio.h> #include <stdlib.h> #define LIST_INIT_SIZE 100 #define LIST_INCREMENT 10 typedef int ElemType; typedef struct { ElemType *elem; int length; int listSize; }SqList; int compare(ElemType elem1, ElemType elem2) { return (elem1 - elem2); } void visit(ElemType e) { printf("%d/t", e); } int InitList(SqList *L) { L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)); if (L->elem == NULL) { return -1; } L->length = 0; L->listSize = LIST_INIT_SIZE; return 0; } int DestroyList(SqList *L) { if (L == NULL) { return -1; } if (L->elem != NULL) { free(L->elem); L->elem = NULL; } L->length = 0; L->listSize = 0; return 0; } int ClearList(SqList *L) { L->length = 0; return 0; } int ListEmpty(SqList *L) { if (L == NULL) { return -1; } if (L->length > 0) { return 1; } else { return 0; } } int ListLength(SqList *L) { if (L == NULL) { return -1; } return L->length; } int GetElem(SqList *L, int i, ElemType *e) { if ((L == NULL) || (e == NULL)) { return -1; } if ((i <= 0) || (i > L->length)) { return -1; } *e = L->elem[i - 1]; return 0; } int LocateElem(SqList *L, ElemType e, int (*compare)(ElemType elem1, ElemType elem2)) { int i = 0; if ((L == NULL) || (compare == NULL)) { return -1; } for (i = 0; i < L->length; i++) { if (compare(L->elem[i], e) == 0) { break; } } if (i < L->length) { return i + 1; } else { return 0; } } int PriorElem(SqList *L, ElemType cur_e, ElemType *pre_e) { int i = 0; if ((L == NULL) || (pre_e == NULL)) { return -1; } for (i = 0; i < L->length; i++) { if (compare(L->elem[i], cur_e) == 0) { break; } } if ((i == 0) || (i >= L->length)) { return -1; } else { *pre_e = L->elem[i - 1]; } return 0; } int NextElem(SqList *L, ElemType cur_e, ElemType *next_e) { int i = 0; if ((L == NULL) || (next_e == NULL)) { return -1; } for (i = 0; i < L->length; i++) { if (compare(L->elem[i], cur_e) == 0) { break; } } if (i >= L->length - 1) { return -1; } else { *next_e = L->elem[i + 1]; } return 0; } int ListInsert(SqList *L, int i, ElemType e) { ElemType *newbase = NULL; ElemType *p = NULL; ElemType *q = NULL; if (L == NULL) { return -1; } if ((i < 1) || (i > L->length + 1)) { return -1; } if (L->length >= L->listSize) { newbase = (ElemType *)realloc(L->elem, (L->listSize + LIST_INCREMENT) * sizeof(ElemType)); if (newbase == NULL) { return -1; } L->elem = newbase; L->listSize += LIST_INCREMENT; } p = &L->elem[L->length - 1]; q = &L->elem[i -1]; for (; p >= q; p--) { *(p + 1) = *p; } *q = e; L->length++; return 0; } int ListDelete(SqList *L, int i, ElemType *e) { ElemType *p = NULL; ElemType *q = NULL; if ((L == NULL) || (e == NULL)) { return -1; } if ((i < 1) || (i > L->length)) { return -1; } *e = L->elem[i -1]; p = &L->elem[i]; q = &L->elem[L->length - 1]; for (; p <= q; p++) { *(p -1) = *p; } L->length--; return 0; } int ListTraverse(SqList *L, void (*visit)(ElemType e)) { int i = 0; if ((L == NULL) || (visit == NULL)) { return -1; } for (i = 0; i < L->length; i++) { visit(L->elem[i]); } return 0; } int main(void) { int i = 0; SqList L = {0}; ElemType e; InitList(&L); for (i = 0; i < 10; i++) { ListInsert(&L, i + 1, i); } ListTraverse(&L, visit); ListDelete(&L, 1, &e); ListTraverse(&L, visit); NextElem(&L, 2, &e); PriorElem(&L, 2, &e); return 0; }