/*=============================== * 线性表的链式存储结构(链表) * * 包含算法: 2.8、2.9、2.10、2.11 ================================*/ #include "LinkList.h" //**▲02 线性表**// /* * 初始化 * * 只是初始化一个头结点。 * 初始化成功则返回OK,否则返回ERROR。 */ Status InitList(LinkList* L) { (*L) = (LinkList) malloc(sizeof(LNode)); if(*L == NULL) { exit(OVERFLOW); } (*L)->next = NULL; return OK; } /* * 判空 * * 判断链表中是否包含有效数据。 * * 返回值: * TRUE : 链表为空 * FALSE: 链表不为空 */ Status ListEmpty(LinkList L) { // 链表只有头结点时,认为该链表为空 if(L != NULL && L->next == NULL) { return TRUE; } else { return FALSE; } } /* * ████████ 算法2.9 ████████ * * 插入 * * 向链表第i个位置上插入e,插入成功则返回OK,否则返回ERROR。 * *【备注】 * 教材中i的含义是元素位置,从1开始计数 */ Status ListInsert(LinkList L, int i, ElemType e) { LinkList p, s; int j; // 确保链表存 if(L == NULL) { return ERROR; } p = L; j = 0; // 寻找第i-1个结点,且保证该结点本身不为NULL while(p != NULL && j < i - 1) { p = p->next; ++j; } // 如果遍历到头了,或者i的值不合规(比如i<=0),说明没找到合乎目标的结点 if(p == NULL || j > i - 1) { return ERROR; } // 生成新结点 s = (LinkList) malloc(sizeof(LNode)); if(s == NULL) { exit(OVERFLOW); } s->data = e; s->next = p->next; p->next = s; return OK; } /* * ████████ 算法2.10 ████████ * * 删除 * * 删除链表第i个位置上的元素,并将被删除元素存储到e中。 * 删除成功则返回OK,否则返回ERROR。 * *【备注】 * 教材中i的含义是元素位置,从1开始计数 */ Status ListDelete(LinkList L, int i, ElemType* e) { LinkList p, q; int j; // 确保链表存在且不为空表 if(L == NULL || L->next == NULL) { return ERROR; } p = L; j = 0; // 寻找第i-1个结点,且保证该结点的后继不为NULL while(p->next != NULL && j < i - 1) { p = p->next; ++j; } // 如果遍历到头了,或者i的值不合规(比如i<=0),说明没找到合乎目标的结点 if(p->next == NULL || j > i - 1) { return ERROR; } // 删除第i个结点 q = p->next; p->next = q->next; *e = q->data; free(q); return OK; }