预定义:
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
第一类:动态单链表
结点:
typedef struct LNode {
ElemType data;
struct LNode *next;
}LNode, *LinkList;
Status GetElem_L(LinkList L, int i, ElemType &e)
{
//L为带头节点的单链表的头指针
struct LNode *p = L->next; //初始化,p指向头结点后面的第一个结点
int j = 1; //j为计数器
while (p && j < i){
p = p->next;
++j;
}
if (!p || j > i) return ERROR; //第i个元素不存在
e = p->data; //取第i个元素
return OK;
}
ListInsert_L在单链表中的实现
Status ListInsert_L(LinkList &L, int i, ElemType e){
//在带头节点的单链表L中第i个位置之前插入e
LNode *p = L;
int j = 0;
while (p && j < i - 1) { //寻找第i-1个结点
p = p->next;
j++;
}
if (!p || j > i - 1) return ERROR; //i小于1 或者 大于表长加1
LNode *s = (LNode *)malloc(sizeof(LNode)); //生成新的结点
s->data = e; //插入L中
s->next = p->next;
p->next = s;
return OK;
}
ListDelete_L在单链表中的实现:
Status ListDelete_L(LinkList &L, int i, ElemType e) {
//在带头节点的单链表L中删除第i个结点,并用e返回其值
LNode *p = L;
int j = 0;
while (p->next && j < i - 1){
p = p->next; <span style="white-space:pre"> </span> //如果该循环正常退出,j=i+1,p指向i结点的前驱
++j;
}
if (!(p->next) || j > i - 1) return ERROR; //删除位置不合理
LNode *q = p->next; p->next = q->next; //删除并释放结点
e = q->data;
free(q);
return OK;
}
创建链表
void CreatList_L(LinkList &L, int n)
{
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
for (int i = n; i > 0; --i)
{
LNode *p = (LinkList)malloc(sizeof(LNode));
scanf((const char*)&p->data);
p->next = L->next;
L->next = p;
}
}
第二类:静态单链表:
结点:
#define MAXSIZE 100
typedef struct {
ElemType data;
int cur;
}comonent, SLinkList[MAXSIZE];
定位函数
int LocateElem_SL(SLinkList S, ElemType e) {
//在静态单链线性表查找第一个值为e的元素
//若找到,则返回它在L中的位序,否则返回0
int i = S[0].cur; //用整型游标i代替动态指针
while (i && S[i].data != e) i = S[i].cur;
return i;
}
讨论静态链表的算法 (A-B)∪(B-A)
以下分为三个部分实现:
1.将整个数组空间初始化成一个空链表:
void InitSpace_SL(SLinkList &space)
{
//将一维数组space中各分量链成一个备用链表,space[0].cur为头指针
//“0”表示空指针
for (int i = 0; i < MAXSIZE - 1; ++i) space[0].cur = i + 1;
space[MAXSIZE - 1].cur = 0;
}
2.从备用空间取得一个结点
int Malloc_SL(SLinkList &space)
{
//若备用空间链表非空,则返回分配的结点下标,否则返回0
int i = space[0].cur;
if (space[0].cur) space[0].cur = space[i].cur;
return i;
}
3.将空闲结点链到备用链表上
void Free_SL(SLinkList &space, int k)
{
//将下标为k的空闲节点回收到备用结点
space[k].cur = space[0].cur;
space[0].cur = k;
}