数据结构与算法线性表复习习题【6】[1]以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
已知A B和C为三个递增有序的线性表 现要求对A表作如下操作 删去那些既在B表中出现又在C表中出现的元素 试对顺序表编写实现上述操作的算法 并分析你的算法的时间复杂度(注意 题中没有特别指明同一表中的元素值各不相同)
解
// 在A中删除既在B中出现又在C中出现的元素 结果放在D中
Status ListUnion_Sq(SqList &D SqList &A SqList &B SqList &C)
{
SqList Temp;
InitList_Sq(Temp);
ListCross_L(B C Temp);
ListMinus_L(A Temp D);
}
要求同 题 试对单链表编写算法 请释放A表中的无用结点空间
解
// 在A中删除既在B中出现又在C中出现的元素 并释放B C
Status ListUnion_L(LinkList &A LinkList &B LinkList &C)
{
ListCross_L(B C);
ListMinus_L(A B);
}
// 求集合A B 结果放在A表中 并删除B表
Status ListMinus_L(LinkList &A LinkList &B)
{
LinkList pa pb qa qb pt;
pa=A;
pb=B;
qa=pa;// 保存pa的前驱指针
qb=pb;// 保存pb的前驱指针
pa=pa >next;
pb=pb >next;
while(pa&&pb){
if(pb >datadata){
pt=pb;
pb=pb >next;
qb >next=pb;
free(pt);
}
else
if(pb >data>pa >data){
qa=pa;
pa=pa >next;
}
else{
pt=pa;
pa=pa >next;
qa >next=pa;
free(pt);
}
}
while(pb){
pt=pb;
pb=pb >next;
qb >next=pb;
free(pt);
}
pb=B;
free(pb);
return OK;
}
假设某个单向循环链表的长度大于 且表中既无头结点也无头指针 已知s为指向链表中某个结点的指针 试编写算法在链表中删除指针s所指结点的前驱结点
解
// 在单循环链表S中删除S的前驱结点
Status ListDelete_CL(LinkList &S)
{
LinkList p q;
if(S==S >next)return ERROR;
q=S;
p=S >next;
while(p >next!=S){
q=p;
p=p >next;
}
q >next=p >next;
free(p);
return OK;
} lishixinzhi/Article/program/sjjg/201311/23386
分页:123