链表的类C实现: lklist.h: /* * lklist.h */ #ifndef LKLIST_H_ #define LKLIST_H_ #define OK 1 #define ERROR -1 typedef int ElemType; typedef struct lknode { ElemType data; struct lknode *next; }linklist; #define NODESZ sizeof(linklist) linklist *InitLklist(linklist *L); linklist *CreateListF(linklist *L, ElemType a[], int n); linklist *CreateListR(linklist *L, ElemType a[], int n); int ListEmpty(linklist *L); int ListLength(linklist *L); linklist *GetElem(linklist *L, int i); int PrintLklist(linklist *L); int LocateElem(linklist *L, ElemType x); linklist *ListInsert(linklist *L, int i, ElemType e); linklist *ListDelete(linklist *L, int i, ElemType *e); linklist *PriorElem(linklist *L, ElemType e); linklist *NextElem(linklist *L, ElemType e); linklist *ReverseLklist(linklist *L); #endif /* LKLIST_H_ */ lklist.c: /* * lklist.c */ #include "lklist.h" #include <stdio.h> #include <stdlib.h> linklist *InitLklist(linklist *L) { L = (linklist *) malloc(NODESZ); if (L != NULL) { L->next = NULL; } return L; } linklist *CreateListF(linklist *L, ElemType a[], int n) { if (NULL == L) { printf("ERROR: The list is NULL!/n"); } int i; linklist *s; for (i = 0; i < n; ++i) { s = (linklist *) malloc(NODESZ); s->data = a[i]; s->next = L->next; L->next = s; } return L; } linklist *CreateListR(linklist *L, ElemType a[], int n) { if (NULL == L) { printf("ERROR: The list is NULL!/n"); } int i; linklist *r, *s; r = L; for (i = 0; i < n; ++i) { s = (linklist *) malloc(NODESZ); s->data = a[i]; r->next = s; r = s; } r->next = NULL; return L; } int ListEmpty(linklist *L) { return (NULL == L->next); } int ListLength(linklist *L) { if (NULL == L) { printf("ERROR: The list is NULL!/n"); return ERROR; } int i = 0; linklist *p = L; while (p->next != NULL) { i++; p = p->next; } return i; } linklist *GetElem(linklist *L, int i) { if (NULL == L) { printf("ERROR: The list is NULL!/n"); return NULL; } linklist *p = L->next; int j = 1; while (p != NULL && j < i) { j++; p = p->next; } if (p != NULL && j == i) { return p; } else { printf("ERROR: Can't find the elem, the position maybe invalid!/n"); return NULL; } } int PrintLklist(linklist *L) { if (NULL == L) { printf("ERROR: The list is NULL!/n"); return ERROR; } printf("==============/n"); linklist *p = L->next; while (p != NULL) { printf("%d/n", p->data); p = p->next; } printf("==============/n"); return OK; } int LocateElem(linklist *L, ElemType x) { if (NULL == L) { printf("ERROR: The list is NULL!/n"); return ERROR; } linklist *p = L->next; int i = 1; while (p != NULL && p->data != x) { p = p->next; i++; } if (p != NULL) { return i; } else { return ERROR; } } linklist *ListInsert(linklist *L, int i, ElemType e) { linklist *p = L; int j = 0; while (p != NULL && j < i - 1) { p = p->next; j++; } if (p == NULL || j > i - 1) { printf("ERROR: The position is invalid!/n"); return L; } linklist *s = (linklist *) malloc(NODESZ); s->data = e; s->next = p->next; p->next = s; return L; } linklist *ListDelete(linklist *L, int i, ElemType *e) { linklist *p = L; int j = 0; while (p->next != NULL && j < i - 1) { p = p->next; j++; } if (p->next == NULL || j > i - 1) { printf("ERROR: The position is invalid!/n"); return L; } linklist *q = p->next; *e = q->data; p->next = q->next; free(q); return L; } linklist *PriorElem(linklist *L, ElemType e) { linklist *p = L->next; linklist *q = NULL; while (p != NULL && p->data != e) { q = p; p = p->next; } if (p == NULL) { printf("Error: The element can't be found!/n"); return NULL; } else { return q; } } linklist *NextElem(linklist *L, ElemType e) { linklist *p = L; while (p->next != NULL && p->data != e) { p = p->next; } if (p == NULL || p->next == NULL) { printf("Error: The element can't be found!/n"); return NULL; } else { return p->next; } } linklist *ReverseLklist(linklist *L) { linklist *p = L->next; linklist *q = NULL; linklist *h = NULL; while (p != NULL) { q = p->next; p->next = h; h = p; p = q; } L->next = h; return L; } 测试的主程序文件(main函数): LinkList.c: /* ============================================================================ Name : LinkList.c Author : Version : Copyright : Description : Hello World in C, Ansi-style ============================================================================ */ #include <stdio.h> #include <stdlib.h> #include "lklist.h" int main(void) { linklist *L; L=InitLklist(L); if(NULL==L->next) { printf("yes!Empty!/n"); } ElemType a[]={1,2,3,4,5,6,7,8,9,10}; L=CreateListR(L,a,10); printf("================/n"); printf("The length is %d/n",ListLength(L)); PrintLklist(L); L=ListInsert(L,1,0); PrintLklist(L); L=ListInsert(L,12,11); PrintLklist(L); L=ListInsert(L,8,66); PrintLklist(L); printf("@@@@@@@@@@@@@@@/n"); ElemType e; L=ListDelete(L,1,&e); PrintLklist(L); printf("%d/n",e); L=ListDelete(L,12,&e); PrintLklist(L); printf("%d/n",e); L=ListDelete(L,7,&e); PrintLklist(L); printf("%d/n",e); L=ReverseLklist(L); PrintLklist(L); return EXIT_SUCCESS; }