源码+注释
#include <stdio.h>
#include <malloc.h>
#define LIST_NUM1 10
#define LIST_NUM2 10
typedef enum {
ERROR,
OK
} Status;
typedef enum {
FALSE,
TRUE
} boolean;
typedef int ElemType;
typedef struct LNode {
ElemType data;
struct LNode *next;
} LNode, *LinkList;
Status InitList(LinkList list);
void CreateListHead(LinkList list, int n);
void CreateListTail(LinkList list, int n);
Status GetElem(LinkList list, int i, ElemType *e);
LNode *FindElem(LinkList list, ElemType *e);
Status InsertElem(LinkList list, int i, ElemType *e);
Status DeleteElem(LinkList list, int i, ElemType *e);
Status ClearList(LinkList list);
boolean IsEmpty(LinkList list);
int main() {
LNode List;
printf("%d\n", InitList(&List));
CreateListHead(&List, LIST_NUM1);
CreateListTail(&List, LIST_NUM2);
int num1;
GetElem(&List, 2, &num1);
printf("%d\n", num1);
int num2 = 8;
printf("%d\n", FindElem(&List, &num2)->data);
printf("%d\n", InsertElem(&List, 11, &num2));
DeleteElem(&List, 2, &num2);
printf("%d\n", num2);
printf("%d\n", ClearList(&List));
printf("%d\n", IsEmpty(&List));
printf("\n%d%d%d%d", ERROR, OK, FALSE, TRUE);
printf("\n%llu, %llu", sizeof(LNode), sizeof(LinkList));
return 0;
}
Status InitList(LinkList list) {
list = (LinkList) malloc(sizeof(LNode));
if (list == NULL) {
return ERROR;
}
list->next = NULL;
list->data = 0;
return OK;
}
void CreateListHead(LinkList list, int n) {
LNode *temp;
list->next = NULL;
for (int i = 0; i < n; i++) {
temp = (LinkList) malloc(sizeof(LNode));
temp->data = i + 1;
temp->next = list->next;
list->next = temp;
}
list->data = n;
}
void CreateListTail(LinkList list, int n) {
LNode *pL = list;
LNode *temp;
for (int i = 0; i < n; i++) {
temp = (LinkList) malloc(sizeof(LNode));
temp->data = i + 1;
temp->next = NULL;
pL->next = temp;
pL = temp;
}
list->data = n;
}
Status GetElem(LinkList list, int i, ElemType *e) {
LNode *pL = list->next;
int j = 1;
while (pL && j < i) {
pL = pL->next;
++j;
}
if (!pL || j > i) {
return ERROR;
}
*e = pL->data;
return OK;
}
LNode *FindElem(LinkList list, ElemType *e) {
LNode *pL = list->next;
while (pL && pL->data != *e) {
pL = pL->next;
}
return pL;
}
Status InsertElem(LinkList list, int i, ElemType *e) {
LNode *pL = list;
int j = 1;
while (pL && j < i) {
pL = pL->next;
++j;
}
while (!pL || j > i) {
return ERROR;
}
LNode *temp = (LinkList) malloc(sizeof(LNode));
temp->data = *e;
temp->next = pL->next;
pL->next = temp;
list->data++;
return OK;
}
Status DeleteElem(LinkList list, int i, ElemType *e) {
LNode *pL = list, *temp;
int j = 1;
while ((pL->next) && j < i) {
pL = pL->next;
++j;
}
while (!(pL->next) || j > i) {
return ERROR;
}
temp = pL->next;
pL->next = temp->next;
*e = temp->data;
free(temp);
list->data--;
return OK;
}
Status ClearList(LinkList list) {
LNode *pL, *temp;
pL = list->next;
while (pL) {
temp = pL->next;
free(pL);
pL = temp;
}
list->next = NULL;
list->data = 0;
return OK;
}
boolean IsEmpty(LinkList list) {
if (list->next == NULL) {
return TRUE;
} else {
return FALSE;
}
}
void PrintList(LinkList list) {
LNode *pL;
int count = 0;
printf("->{%2d}", list->data);
for (pL = list->next; pL != NULL; pL = pL->next) {
printf("->");
printf("(%2d)", pL->data);
if (++count % 10 == 0 && count != list->data) {
printf("\n ");
}
}
printf("\n");
}