目录
一、双向链表的插入与删除
1、插入
双向链表的插入操作:确定插入位置的前驱与后继的位置,进而实现插入操作。
Status ListInsert_DuL(DuLinkList& L, int i, ElemType e)
{
// 在带头结点的双向链表工中第i个位置之前插入元素e
if (!(p = GetElem_DuL(L,i))) //在L中确定第i个元素的位置指针p
return ERROR;
s = new DuLNode; //生成新结点*s
s->data = e; //将结点*s数据域置为e
s->prior = p->prior; //将结点*s插入工中
p->prior->next = s;
s->next = p;
p->prior = s;
return OK;
}
2、删除
双向链表的删除操作:修改被删结点的的前驱结点的后继指针与被删结点的后继结点的前驱指针,再释放被删结点的空间。
Status ListDelete_DuL(DuLinkList &L, int i)
{
//删除带头结点的双向链表工中的第1个元素
if (!(p = GetElem_DuL(L,i)))
return ERROR;
p->prior->next = p->next; // 修改被删结点的前驱结点的后继指针
p->next->prior = p->prior; // 修改被删结点的后继结点的前驱指针
delete p; //释放被删结点的空间
return OK;
}
二、集合的合并
集合的合并操作:将一个线性表L2的数据元素插入另一线性表L1中,遍历L2,将L2中存在的和L1中不相同的数据元素赋值给插入元素e,再将e插入在L1的最后,实现集合的合并操作。
void MergeList(List& L1, List L2)
{
//将所有在线性表L2中但不在L1中的数据元素插入L1中
m = ListLength(L1); n = ListLength(L2); //线性表的长度
for (i = 1; i <= n; i++)
{
GetElem(L2, i, e); //取L2中第i个数据元素赋给e
if (!LocateElem(L1, e)) //L1中不存在和e相同的数据元素
ListInsert(L1, ++m, e); //将e插在L1的最后
}
}
三、有序线性表的合并
1、有序顺序表的合并
有序顺序表的合并操作:创建新的顺序表,初始化两个指针分别指向两个要合并的顺序表的第一个元素,比较两个指向元素的值,将值较小的结点插入新表的表尾,将两指针后移,循环操作直至一指针到达顺序表表尾,再将另一顺序表剩余元素插入新表的最后,实现有序链表合并。
void MergeList_Sq(SqList LA, SqList LB, SqList &LC)
{
//归并LA和LB得到新的顺序有序表LC
//新表长度为待合并两表长度之和
LC.length = LA.length + LB.length;
//分配空间
LC.elem = new ElemType[LC.lengthJ;
//指针pc指向新表的第一个元素
pc = LC.elem;
//指针pa,pb分别指向两个表的第一个元素
pa = LA.elem;
pb = LB.elem;
//指针pa_last,pb_last分别指向两个表的最后一个元素
pa_last = LA.elem + LA.length - 1;
pb_last = LB.elem + LB.length - 1;
while ((pa <= pa_last) && (pb <= pb last))//未达到LA和LB的表尾
{
if (*pa <= *pb)*pc++ = *pa++; //依次摘取两表中值最小的节点插入LC最后
else *pc++ = *pb++;
}
//两表中有一个表到达表尾,依次将另一个表的剩余元素插入LC的最后
while (pa <= pa_last) *pc++ = *pa++;
while (pb <= pb_last)*pc++ = *pb++;
}
2、有序单链表的合并
有序单链表的合并操作:与有序顺序表合并操作相似,不同点:头结点的操作:插入前,将新链表的头结点取值为其中一个链表的头结点,插入完成后,释放另一链表的头结点。
void MergeList_L(LinkList& LA, LinkList& LB, LinkList& LC)
{
pa = LA->next; pb = LB->next;
//用La的头结点作为Lc的头结点
LC = LA;
pc = LC;
//LA和LB均未到达表尾,依次取两表中值最小的结点插入LC的最后
while (pa && pb)
{
if (pa->data <= pb->data)
{
//取pa指针指向结点
pc->next = pa;
pc = pa;
pa = pa->next;
}
else
{
//取pb指针指向结点
pc->next = pb;
pc = pb;
pb = pb->next;
}
}
pc->next = pa ? pa : pb; //插入剩余段
delete LB; //释放LB的头结点
}