第二章线性表-习题1-10
目录
1.将两个递增的有序表LA和LB合并为一个递增的有序链表LC。
2.将两个非递减的有序链表LA和LB合并为一个非递增的有序链表LC。
4.LA和LB差集的结果存储于LA中,n是结果集合中元素个数,调用时为0。
8.删除递增有序链表L中值大于mink且小于maxk的所有元素。
1.将两个递增的有序表LA和LB合并为一个递增的有序链表LC。
//---第二章线性表-习题1---//
void MergeList_1(LinkList &LA,LinkList &LB,LinkList &LC)
{
//将两个递增的有序表LA和LB合并为一个递增的有序链表LC
LinkList pa=LA->next;
LinkList pb=LB->next;
LinkList pc=LC=LA;
while(pa&&pb)
{
if(pa->data<pb->data)
{
pc->next=pa;
pc=pa;
pa=pa->next;
}
else if(pa->data>pb->data)
{
pc->next=pb;
pc=pb;
pb=pb->next;
}
else
{
pc->next=pa;
pc=pa;
pa=pa->next;
LinkList q=pb->next;
delete pb;
pb=q;
}
pc->next=pa?pa:pb;
delete LB;
}
}
2.将两个非递减的有序链表LA和LB合并为一个非递增的有序链表LC。
//---第二章线性表-习题2---//
void MergeList_2(LinkList &LA,Linklist &LB,LinkList &LC)
{
//将两个非递减的有序链表LA和LB合并为一个非递增的有序链表LC
LinkList pa=LA->next;
LinkList pb=LB->next;
LinkList pc=LC=LA;
LC->next=NULL;
while(pa||pb)
{
if(!pa)
{
LinkList q=pb;
pb=pb->next;
}
else if(!pb)
{
LinkList q=pa;
pa=pa->next;
}
else if(pa->data<=pb->data)
{
LinkList q=pa;
pa=pa->next;
}
else
{
LinkList q=pb;
pb=pb->next;
}
q->next=LC->next;
LC->next=q;
}
delete LB;
}
3.A与B的交集。
//---第二章线性表-习题3---//
void InsertSection(LinkList &LA,LinkList &LB,LinkList &LC)
{
//A与B的交集
LinkList pa=LA->next;
LinkList pb=LB->next;
LinkList pc=LC=LA;
while(pa&&pb)
{
if(pa->data==pb->data)
{
pc->next=pa;
pc=pa;
pa=pa->next;
LinkList q=pb;
pb=pb->next;
delete q;
}
else if(pa->data<pb->data)
{
LinkList q=pa;
pa=pa->next;
delete q;
}
else
{
LinkList q=pb;
pb=pb->next;
delete q;
}
}
while(pa)
{
LinkList q=pa;
pa=pa->next;
delete q;
}
while(pb)
{
LinkList q=pb;
pb=pb->next;
delete q;
}
pc->next=NULL;
delete LB;
}
4.LA和LB差集的结果存储于LA中,n是结果集合中元素个数,调用时为0。
//---第二章线性表-习题4---//
void Difference(LinkList &LA,LinkList &LB,int &n)
{
//LA和LB差集的结果存储于LA中,n是结果集合中元素个数,调用时为0
LinkList pa=LA->next;
LinkList pb=LB->next;
LinkList pre=LA;
while(pa&&pb)
{
if(pa->data<pb->data)
{
n++;
pre=pa;
pa=pa->next;
}
else if(pa->data>pb->data)
{
pb=pb->next;
}
else
{
pre->next=pa->next;
LinkList u=pa;
pa=pa->next;
delete u;
}
}
while(pa)
{
n++;
pa=pa->next;
}
}
5.单链表A分解为两个具有相同结构的链表B和C。
//---第二章线性表-习题5---//
void Decompose(LinkList &A,LinkList &B,LinkList &C)
{
//单链表A分解为两个具有相同结构的链表B和C
B=A;
B->next=NULL;
C=new LNode;
C->next=NULL;
p=A->next;
while(p!=NULL)
{
LinkList r=p->next;
if(p->data<0)
{
p->next=B->next;
B->next=p;
}
else
{
p->next=C->next;
C->next=p;
}
p=r;
}
}
6.确定单链表中值最大的结点。
//---第二章线性表-习题6---//
ElemType Max(LinkList L)
{
//确定单链表中值最大的结点
if(L->next==NULL) return ERROR;
LinkList pmax=L->next;
LinkList p=L->next->next;
while(p!=NULL)
{
if(pmax->data<p->data)
{
pmax=p;
}
p=p->next;
}
return pmax->data;
}
7.逆置带头结点的单链表。
//---第二章线性表-习题7---//
void Inverse(LinkList &L)
{
//逆置带头结点的单链表
LinkList p=L->next;
L->next=NULL;
while(p!=NULL)
{
LinkList q=p->next;
p->next=L->next;
L->next=p;
p=q;
}
}
8.删除递增有序链表L中值大于mink且小于maxk的所有元素。
//---第二章线性表-习题8---//
void DeleteMinMax(LinkList &L,int mink,int maxk)
{
//删除递增有序链表L中值大于mink且小于maxk的所有元素
LinkList p=L->next;
while(p&&p->data<=mink)
{
LinkList pre=p;
p=p->next;
}
while(p&&p->data<maxk)
{
p=p->next;
}
LinkList q=pre->next;
pre->next=p;
while(q!=p)
{
LinkList s=q->next;
delete q;
q=s;
}
}
9.在双向循环链表,交换p所指向的结点及其前驱结点的顺序。
//---第二章线性表-习题9---//
void Exchange(DuLinkList p)
{
//在双向循环链表,交换p所指向的结点及其前驱结点的顺序
DuLinkList q=p->prior;
q->prior->next=p;
p->prior=q->prior;
q->next=p->next;
q->prior=p;
p->next->prior=q;
p->next=q;
}
10.删除顺序表A中所有值为item的元素。
//---第二章线性表-习题10---//
void DeleteItem(SqList &A,ElemType item)
{
//删除顺序表A中所有值为item的元素
int k=0;
for(int i=0;i<A.length;i++)
{
if(A.elem[i]!=item)
{
A.elem[k]=A.elem[i];
k++;
}
A.length=k;
}
}