线性表的链式表示和实现
单链表(带头节点):
typedef struct LNode {
Elemtype data;
struct LNode* next;
}LNode, *LinkList;
bool InitList(LinkList& L) {
L = new LNode;
if (L == NULL)return false;
else L->next = NULL; return true;
}//创建空表
void DestroyList(LinkList& L) {
delete L;
}//销毁
bool ListEmpty(LinkList L) {
return(L->next == NULL);
}//判空
int ListLength(LinkList L) {
int len = 0;
LNode* p = L;
while (p->next != NULL) {
p = p->next;
len++;
}
return len;
}//表长
LNode* GetElem(LinkList L,int i) {
if (i < 0)return NULL;
LNode* p; p = L;
int j = 0;
while (p != NULL && j < i) {
p = p->next;
j++;
}
return p;
}//返回L中第i个数据元素(按位查找)
LNode* LocateElem(LinkList L,int e,bool (*compare)(Elemtype,Elemtype)){
LNode* p = L->next;
while (p != NULL && !compare(e,p->data))p = p->next;
return p;
}//返回表L中值为e的指针(按值查找)
bool ListInsert(LinkList &L,int i,Elemtype e) {
if (i < 1)return false;
LNode* p = GetElem(L, i - 1);
if (p == NULL)return false;
LNode* s = new LNode;
if (s == NULL)return false;
s->data = e;
s->next = p->next;
p->next = s;
return true;
}//在L的第i位的元素前插入元素e(带头结点)
bool InsertNextNode(LNode* p, Elemtype e) {
if (p == NULL)return false;
LNode* s = new LNode;
if (s == NULL)return false;
s->data = e;
s->next = p->next;
p->next = s;
return true;
}//在指定结点p后插入元素e
bool InsertPriorNode(LNode* p, Elemtype e) {
if (p == NULL)return false;
LNode* s = new LNode;
if (s == NULL)return false;
s->data = p->data;
p->data = e;
s->next = p->next;
p->next = s;
return true;
}//在指定结点p前插入元素e
bool ListDelete(LinkList& L, int i, Elemtype &e) {
if (i < 1)return false;
LNode* p = GetElem(L, i - 1);
if (p == NULL)return false;
LNode* q = p->next;
e = q->data;
p->next = q->next;
delete q; return true;
}//用e返回L中第i位元素并删除该元素
bool DeleteNode(LNode* p) {
if (p == NULL)return false;
LNode* q = p->next;
p->data = q->data;
p->next = q->next;
delete q;return true;
}//删除指定结点p(p是最后一个结点此方法不可行)
bool ListTraverse(LinkList L, void (*visit)(Elemtype)) {
LNode* p = L->next;
if (p == NULL)return false;
while (p != NULL){
visit(p->data);
p = p->next;
}
return true;
}//用visit函数遍历L
双链表:
typedef struct DNode {
Elemtype data;
struct DNode* prior,* next;
}DNode, * DLinkList;
bool InitList(DLinkList& L) {
L = new DNode;
if (L == NULL)return false;
else L->next = NULL; L->prior=NULL; return true;
}//创建空表
void DestroyList(DLinkList& L) {
while (L->next != NULL)DeleteNextDNode(L);
delete L;
L = NULL;
}//销毁
bool ListEmpty(DLinkList L) {
return(L->next == NULL);
}//判空
int ListLength(DLinkList L) {
int len = 0;
DNode* p = L;
while (p->next != NULL) {
p = p->next;
len++;
}
return len;
}//表长
DNode* GetElem(DLinkList L, int i) {
if (i < 0)return NULL;
DNode* p; p = L;
int j = 0;
while (p != NULL && j < i) {
p = p->next;
j++;
}
return p;
}//返回L中第i个数据元素(按位查找)
DNode* LocateElem(DLinkList L, Elemtype e, bool (*compare)(Elemtype , Elemtype )) {
DNode* p = L->next;
while (p != NULL && !compare(e, p->data))p = p->next;
return p;
}//返回表L中值为e的指针(按值查找)
bool ListInsert(DLinkList& L, int i, Elemtype e) {
if (i < 1)return false;
DNode* p = GetElem(L, i - 1);
if (p == NULL)return false;
DNode* s = new DNode;
if (s == NULL)return false;
s->data = e;
s->next = p->next;
s->prior = p;
p->next = s;
return true;
}//在L的第i位的元素前插入元素e(带头结点)
bool InsertNextDNode(DNode* p, DNode* s) {
if (p == NULL || s == NULL)return false;
s->next = p->next;
if (p->next != NULL)
p->next->prior = s;
s->prior = p;
p->next = s;
return true;
}//在结点p后插入结点s
bool InsertPriorDNode(DNode* p, DNode* s) {
if (p == NULL || s == NULL)return false;
p = p->prior;
if (InsertNextDNode(p, s))return true;
else return false;
}//在结点p前插入结点s
bool InsertNextNode(DNode* p, Elemtype e) {
if (p == NULL)return false;
DNode* s = new DNode;s->data = e;
if (InsertNextDNode(p, s))return true;
else return false;
}//在指定结点p后插入元素e
bool InsertPriorNode(DNode* p, Elemtype e) {
if (p == NULL)return false;
DNode* s = new DNode;s->data = e;
p = p->prior;
if (InsertNextDNode(p, s))return true;
else return false;
}//在指定结点p前插入元素e
bool DeleteNextDNode(DNode* p) {
if (p == NULL)return false;
DNode* q = p->next;
if (q == NULL)return false;
p->next = q->next;
if (q->next != NULL)q->next->prior = p;
delete q;return true;
}//删除p结点后面的一个结点
bool ListDelete(DLinkList& L, int i, Elemtype & e) {
if (i < 1)return false;
DNode* p = GetElem(L, i - 1);
if (p == NULL)return false;
DNode* q = p->next;
e = q->data;
p->next = q->next;
if (q->next != NULL)q->next->prior = p;
delete q; return true;
}//用e返回L中第i位元素并删除该元素
bool DeleteNode(DNode* p) {
if (p == NULL)return false;
p->prior->next = p->next;
if (p->next != NULL)p->next->prior = p->prior;
delete p; return true;
}//删除指定结点p
bool ListTraverse(DLinkList L, void (*visit)(Elemtype )) {
DNode* p = L->next;
if (p == NULL)return false;
while (p != NULL) {
visit(p->data);
p = p->next;
}
return true;
}//用visit函数遍历L
bool ListTraverse_Next(DNode* p, void (*visit)(Elemtype )) {
if (p == NULL)return false;
while (p != NULL) {
visit(p->data);
p = p->next;
}
return true;
}//用visit函数后向遍历结点p
bool ListTraverse_Prior(DNode* p, void (*visit)(Elemtype )) {
if (p == NULL)return false;
while (p->prior != NULL) {
visit(p->data);
p = p->prior;
}
return true;
}//用visit函数前向遍历结点p(跳过头节点)
循环双链表:
typedef struct DNode {
Elemtype data;
struct DNode* prior, * next;
}DNode, * DLinkList;
bool InitList(DLinkList& L) {
L = new DNode;
if (L == NULL)return false;
else L->next = L; L->prior = L; return true;
}//创建空表
bool ListEmpty(DLinkList L) {
return(L->next == L);
}//判空
bool ListTail(DLinkList L, DNode* p) {
return(p->next == L);
}//判断p结点是否是循环双链表L的表尾结点
int ListLength(DLinkList L) {
int len = 0;
DNode* p = L;
while (!ListTail(L,p)) {
p = p->next;
len++;
}
return len;
}//表长
DNode* GetElem(DLinkList L, int i) {
if (i < 0)return NULL;
DNode* p; p = L;
int j = 0;
while (!ListTail(L, p) && j < i) {
p = p->next;
j++;
}
return p;
}//返回L中第i个数据元素(按位查找)
DNode* LocateElem(DLinkList L, int e, bool (*compare)(Elemtype , Elemtype )) {
DNode* p = L->next;
while (!ListTail(L, p) && !compare(e, p->data))p = p->next;
return p;
}//返回表L中值为e的指针(按值查找)
bool ListInsert(DLinkList& L, int i, Elemtype e) {
if (i < 1)return false;
DNode* p = GetElem(L, i - 1);
if (p == NULL)return false;
DNode* s = new DNode;
if (s == NULL)return false;
s->data = e;
s->next = p->next;
s->prior = p;
p->next = s;
return true;
}//在L的第i位的元素前插入元素e(带头结点)
bool InsertNextDNode(DNode* p, DNode* s) {
if (p == NULL || s == NULL)return false;
s->next = p->next;
s->prior = p;
p->next->prior = s;
p->next = s;
return true;
}//在结点p后插入结点s
bool InsertPriorDNode(DNode* p, DNode* s) {
if (p == NULL || s == NULL)return false;
if (InsertNextDNode(p->prior , s))return true;
else return false;
}//在结点p前插入结点s
bool InsertNextNode(DNode* p, Elemtype e) {
if (p == NULL)return false;
DNode* s = new DNode; s->data = e;
if (InsertNextDNode(p, s))return true;
else return false;
}//在指定结点p后插入元素e
bool InsertPriorNode(DNode* p, Elemtype e) {
if (p == NULL)return false;
DNode* s = new DNode; s->data = e;
if (InsertNextDNode(p->prior, s))return true;
else return false;
}//在指定结点p前插入元素e
bool DeleteNextDNode(DNode* p) {
if (p == NULL)return false;
DNode* q = p->next;
if (q == NULL)return false;
p->next = q->next;
q->next->prior = p;
delete q; return true;
}//删除p结点后面的一个结点
void DestroyList(DLinkList& L) {
while (L->next != L)DeleteNextDNode(L);
delete L;
L = NULL;
}//销毁
bool ListDelete(DLinkList& L, int i, Elemtype& e) {
if (i < 1)return false;
DNode* p = GetElem(L, i - 1);
if (p == NULL)return false;
e = p->next->data;
if (DeleteNextDNode(p)); return true;
}//用e返回L中第i位元素并删除该元素
bool DeleteNode(DNode* p) {
if (p == NULL)return false;
p->prior->next = p->next;
p->next->prior = p->prior;
delete p; return true;
}//删除指定结点p
bool ListTraverse(DLinkList L, void (*visit)(int)) {
DNode* p = L->next;
if (p == NULL)return false;
while (!ListTail(L, p->prior)) {
visit(p->data);
p = p->next;
}
return true;
}//用visit函数遍历L