数据结构常用算法
来源:互联网 发布:zookeeper和nginx 编辑:程序博客网 时间:2024/05/18 12:37
void Union(List &La, List Lb) { // 算法2.1
// 将所有在线性表Lb中但不在La中的数据元素插入到La中
int La_len,Lb_len,i;
ElemType e;
La_len = ListLength(La); // 求线性表的长度
Lb_len = ListLength(Lb);
for (i=1; i<=Lb_len; i++) {
GetElem(Lb, i, e); // 取Lb中第i个数据元素赋给e
if (!LocateElem(La, e, equal)) // La中不存在和e相同的数据元素
ListInsert(La, ++La_len, e); // 插入
}
} // union
void MergeList(List La, List Lb, List &Lc) { // 算法2.2
// 已知线性表La和Lb中的元素按值非递减排列。
// 归并La和Lb得到新的线性表Lc,Lc的元素也按值非递减排列。
int La_len, Lb_len;
ElemType ai, bj;
int i=1, j=1, k=0;
InitList(Lc);
La_len = ListLength(La);
Lb_len = ListLength(Lb);
while ((i <= La_len) && (j <= Lb_len)) { // La和Lb均非空
GetElem(La, i, ai);
GetElem(Lb, j, bj);
if (ai <= bj) {
ListInsert(Lc, ++k, ai);
++i;
} else {
ListInsert(Lc, ++k, bj);
++j;
}
}
while (i <= La_len) {
GetElem(La, i++, ai); ListInsert(Lc, ++k, ai);
}
while (j <= Lb_len) {
GetElem(Lb, j++, bj); ListInsert(Lc, ++k, bj);
}
} // MergeList
Status InitList_Sq(SqList &L) { // 算法2.3
// 构造一个空的线性表L。
L.elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if (!L.elem) return OK; // 存储分配失败
L.length = 0; // 空表长度为0
L.listsize = LIST_INIT_SIZE; // 初始存储容量
return OK;
} // InitList_Sq
Status ListInsert_Sq(SqList &L, int i, ElemType e) { // 算法2.4
// 在顺序线性表L的第i个元素之前插入新的元素e,
// i的合法值为1≤i≤ListLength_Sq(L)+1
ElemType *p;
if (i < 1 || i > L.length+1) return ERROR; // i值不合法
if (L.length >= L.listsize) { // 当前存储空间已满,增加容量
ElemType *newbase = (ElemType *)realloc(L.elem,
(L.listsize+LISTINCREMENT)*sizeof (ElemType));
if (!newbase) return ERROR; // 存储分配失败
L.elem = newbase; // 新基址
L.listsize += LISTINCREMENT; // 增加存储容量
}
ElemType *q = &(L.elem[i-1]); // q为插入位置
for (p = &(L.elem[L.length-1]); p>=q; --p) *(p+1) = *p;
// 插入位置及之后的元素右移
*q = e; // 插入e
++L.length; // 表长增1
return OK;
} // ListInsert_Sq
Status ListDelete_Sq(SqList &L, int i, ElemType &e) { // 算法2.5
// 在顺序线性表L中删除第i个元素,并用e返回其值。
// i的合法值为1≤i≤ListLength_Sq(L)。
ElemType *p, *q;
if (i<1 || i>L.length) return ERROR; // i值不合法
p = &(L.elem[i-1]); // p为被删除元素的位置
e = *p; // 被删除元素的值赋给e
q = L.elem+L.length-1; // 表尾元素的位置
for (++p; p<=q; ++p) *(p-1) = *p; // 被删除元素之后的元素左移
--L.length; // 表长减1
return OK;
} // ListDelete_Sq
int LocateElem_Sq(SqList L, ElemType e,
Status (*compare)(ElemType, ElemType)) { // 算法2.6
// 在顺序线性表L中查找第1个值与e满足compare()的元素的位序。
// 若找到,则返回其在L中的位序,否则返回0。
int i;
ElemType *p;
i = 1; // i的初值为第1个元素的位序
p = L.elem; // p的初值为第1个元素的存储位置
while (i <= L.length && !(*compare)(*p++, e))
++i;
if (i <= L.length) return i;
else return 0;
} // LocateElem_Sq
void MergeList_Sq(SqList La, SqList Lb, SqList &Lc) { // 算法2.7
// 已知顺序线性表La和Lb的元素按值非递减排列。
// 归并La和Lb得到新的顺序线性表Lc,Lc的元素也按值非递减排列。
ElemType *pa,*pb,*pc,*pa_last,*pb_last;
pa = La.elem; pb = Lb.elem;
Lc.listsize = Lc.length = La.length+Lb.length;
pc = Lc.elem = (ElemType *)malloc(Lc.listsize*sizeof(ElemType));
if (!Lc.elem)
exit(OVERFLOW); // 存储分配失败
pa_last = La.elem+La.length-1;
pb_last = Lb.elem+Lb.length-1;
while (pa <= pa_last && pb <= pb_last) { // 归并
if (*pa <= *pb) *pc++ = *pa++;
else *pc++ = *pb++;
}
while (pa <= pa_last) *pc++ = *pa++; // 插入La的剩余元素
while (pb <= pb_last) *pc++ = *pb++; // 插入Lb的剩余元素
} // MergeList
Status GetElem_L(LinkList &L,int i, ElemType &e) {// 算法2.8
// L为带头结点的单链表的头指针。当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR
LinkList p;
p = L->next;int j = 1;// 初始化,p指向第一个结点,j为计数器
while (p && j<i) {// 顺指针向后查找,直到p指向第i个元素或p为空
p = p->next;++j;
}
if ( !p || j>i ) return ERROR;// 第i个元素不存在
e = p->data;// 取第i个元素
return OK;} // GetElem_L
Status ListInsert_L(LinkList &L, int i, ElemType e) {// 算法2.9
// 在带头结点的单链线性表L的第i个元素之前插入元素e
LinkList p,s;
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或者大于表长
s = (LinkList)malloc(sizeof(LNode));// 生成新结点
s->data = e;s->next = p->next;// 插入L中
p->next = s;
return OK;
} // LinstInsert_L
Status ListDelete_L(LinkList &L, int i, ElemType &e) {// 算法2.10
// 在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
LinkList p,q;
p = L;int j = 0;
while (p->next && j < i-1) {// 寻找第i个结点,并令p指向其前趋
p = p->next;++j;
}
if (!(p->next) || j > i-1) return ERROR;// 删除位置不合理
q = p->next;
p->next = q->next;// 删除并释放结点
e = q->data;
free(q);
return OK;
} // ListDelete_L
- 数据结构常用算法
- 常用数据结构以及算法
- 数据结构常用算法
- 常用算法和数据结构
- 数据结构之常用算法
- 数据结构常用算法
- 数据结构常用算法实现
- 数据结构和常用算法
- 数据结构常用查询算法
- 常用的数据结构算法
- 数据结构常用算法
- 数据结构中常用算法
- 数据结构---常用算法
- 常用数据结构及算法
- 常用数据结构与算法
- 【数据结构】数据结构中常用的排序算法
- java常用数据结构排序算法
- 常用的数据结构以及算法
- C++开源库介绍
- Windows Server 2012 搭建PHP+MySQL环境安装DedeCMS系统
- Android TextView换行问题
- java 对象的强、软、弱和虚引用的概念
- 通过资源的名称,得到保存在R中的ID
- 数据结构常用算法
- 两个SQl数据库中的表相互复制
- Application.StartupPath获取执行文件路径substring()取特定长度字符串取得根目录
- IBM Power虚拟化对金融行业的帮助
- BT源代码学习心得(一):总体描述 -- 转贴自wolfenstein (NeverSayNever)
- Bus Hound 6.01 capture on Windows XP
- sqlserver的DBCC命令使用
- [醒目] 自动生成hql[基于javabean的操作][Java reflect 技术的体现]
- PowerShell入门