继续。。。
因为几个while里忘记更新指针。调试了好久!!!!
烦死了
需要注意的地方。。。
InitList_L函数的参数必须是LinkList* L
即LNode**。
因为InitList_L函数不仅要改变L指向的内容,还要改变L的指向,
若不用LinkList* L 。则无法改变L的指向!
#ifndef __LINKLIST__H__
#define __LINKLIST__H__
#include <stdio.h>
#include <malloc.h>
#define ElemType int
typedef enum {
OK,
NO,
OVERFLOW
}Status;
typedef struct LNode {
ElemType data;
struct LNode *next;
}LNode, *LinkList;
Status InitList_L(LinkList *L) {
if( !(*L = (LinkList)malloc(sizeof(LNode))) ) {
return OVERFLOW;
}
(*L)->next = NULL;
return OK;
}
void DestroyList_L(LinkList L) {
LNode *pL = L;
while (pL->next) {
LNode *temp = pL->next;
free(pL);
pL = temp;
}
free(pL);
}
void ClearList_L(LinkList L) {
LNode *pL = L;
while (pL->next) {
LNode *temp = pL->next;
free(pL);
pL = temp;
}
}
Status ListEmpty_L(LinkList L) {
if (NULL == L->next) {
return OK;
}
return NO;
}
int ListLength_L(LinkList L) {
int count = 0;
LNode *pL = L;
while (NULL != pL->next) {
++count;
pL = pL->next;
}
return count;
}
Status ListInsert_L(LinkList L, int i, ElemType e) {
int length = ListLength_L(L);
if (i < 1 || i > length + 1) {
return OVERFLOW;
}
//pL points to the element which we will insert the e after it
LNode *pL = L;
while (--i) {
pL = pL->next;
}
LNode *temp = (LNode *)malloc(sizeof(LNode));
if (!temp) {
return OVERFLOW;
}
temp->data = e;
temp->next = pL->next;
pL->next = temp;
return OK;
}
Status ListDelete_L(LinkList L, int i, ElemType *e) {
int length = ListLength_L(L);
if (i < 1 || i > length) {
return OVERFLOW;
}
LNode *pL = L;
while (--i) {
pL = pL->next;
}
*e = pL->next->data;
pL->next = pL->next->next;
return OK;
}
Status GetElem_L(LinkList L, int i, ElemType *e) {
int length = ListLength_L(L);
if (i < 1 || i > length) {
return OVERFLOW;
}
LNode *pL = L;
while (--i) {
pL = pL->next;
}
*e = pL->next->data;
return OK;
}
int LocateElem_L(LinkList L, ElemType e) {
int count = 1;
LNode *pL = L->next;
while (pL) {
if (e == pL->data) {
return count;
}
++count;
pL = pL->next;
}
return 0;
}
Status PriorElem_L(LinkList L, ElemType cur_e, ElemType *pre_e) {
int loc = LocateElem_L(L, cur_e);
if (0 == loc || 1 == loc) {
return OVERFLOW;
}
GetElem_L(L, loc - 1, pre_e);
return OK;
}
Status NextElem_L(LinkList L, ElemType cur_e, ElemType *next_e) {
int loc = LocateElem_L(L, cur_e);
if (0 == loc ||ListLength_L(L) == loc) {
return OVERFLOW;
}
GetElem_L(L, loc + 1, next_e);
return OK;
}
void ListTraverse_L(LinkList L, void (*visit)(ElemType)) {
LNode *pL = L->next;
while (pL) {
visit(pL->data);
pL = pL->next;
}
}
#endif