数据结构第二章习题教程文件
- 格式:doc
- 大小:23.50 KB
- 文档页数:4
数据结构第二章习题 精品文档
收集于网络,如有侵权请联系管理员删除 2.5 已知顺序线性表A和B中各存放一个英语单词,字母均为小写。试编写一个判别哪一个单词在字典中排在前面的算法。
int compare (Sqlist A,Sqlist B)
{ //返回值为-1,A中的单词在前,返回值为1,B中的单词在前。
j=0; while(j
{ if(A.elem[j]B.elem[j]) return 1; else j++; }
if(A.lenght>B.length) return 1; else return -1;
}
2.6 顺序表的就地逆置
void Invert_sq(Sqlist &A)
{
for(i=0;i
{
K=A.elem[i]; A.elem[i]=A.elem[A.length-i-1]; A.elem[A.length-i-1]=k; } }
2.7 ha和hb两个指针,链表长度为m,n。将他们链接到一起。
void Cat_LinkList(LinkList ha,LinkList hb,LinkList &hc)
{
If(m
{ P=ha; while(p->next) p=p->next; //指针p指向ha的最后一个结点
P->next=hb; //将hb连接在ha后
hc=ha;
}
Else
{ P=hb; While(p->next) p=p->next; //指针p指向hb的最后一个结点
P->next=ha; //将ha连接在hb后
hc=hb;
}
} //时间复杂度:O(min(m,n))
2.8
void Union_Link(LinkList ha,LinkList hb,LinkList & hc)
{ Pa=ha; pb=hb; I f(!pa) hc=hb; //若ha为空链表 else If (!pb) hc=ha; //若hb为空
else
{ while(pa->next && pb)
{ hb=hb->next; //删除hb中第一个结点,头指针hb后移
pb->next=pa->next; pa->next=pb; pa=pa->next; pa=pa->next; pb=hb;
}
If (!pa->next) pa->next=pb; //若链表hb长度大于ha,则将hb中剩下的结点直接连接在ha后
hc=ha; //新链表头指针
}}
精品文档
收集于网络,如有侵权请联系管理员删除 2.9一个线表表示的线性表中有3累字符的数据元素。将他分割为3个循环链表
void Seg_LinkList(LinkList &L, LinkList &La,LinkList &Lb, LinkList &Lc)
{//
La=(ElemType*)malloc(sizeof(Lnode));//创建头结点
Lb=(ElemType*)malloc(sizeof(Lnode)); Lc=(ElemType*)malloc(sizeof(Lnode));
pa=La; pb=Lb; pc=Lc; pa->next=NULL; pb->next=NULL; pc->next =NULL;
P=L->next; free(L); L=p; while(p)
{ L=L->next; //从链表中撤离第一个结点,此时头指针后移
if(p->data为数字)
{ p->next=pa->next; pa->next=p; pa=pa->next; }
else if(p->data为字母)
{ p->next=pb->next; pb->next=p; pb=pb->next; }
else
{ p->next=pc->next; pc->next=p; pc=pc->next; p=L; //指针p指向L的第一个结点 }
//构建三个循环链表
pa->next=La; pb->next=Lb; pc->next=Lc;
}
2.10以待头结点的双向循环链表表示线性表l,时间复杂度n
void Seg2_Link(LinkList &L)
{//为了保证算法的时间复杂度为O(n),可从尾结点开始操作,每隔一个结点,将其前驱删除,并插入到最后。用指针p1从第n个结点开始往前移动,删除其前驱,用p2往后移动,在p2后面插入结点。
//若结点为偶数个,删除的第一个结点应为第n-2个,若结点数为奇数个,删除的第一个结点为第n-1个,因此要先求结点数
q=L->next; k=0;
while(q->next!=L) //循环链表判断尾结点的条件
{ k++; q=q->next;}
if(k%2) p1=p2=L->prior;
else { p1=L->prior->prior; p2=L->prior;}
while(p1!=L) //p1从后往前移动,直到移动到头结点为止
{ q=p1->prior; q->prior->next=p1; p1->prior=q->prior;
q->next=p2->next; p2->next=q;
q->prior=p2; q->next->prior=q; p1=p1->prior; p2=p2->next; } }
2.11有序表中的元素递增排列。以单链表存储。高效算法。Mink maxk
void delete_Link(LinkList &L,Elemtype mink,Elemtype maxk)
{ p=L; //p指向头结点
while(p->next->data<=mink) p=p->next; q=p->next; while(q->data
{ p->next=q->next; free(q); q=p->next; }}
精品文档
收集于网络,如有侵权请联系管理员删除 2.12
void union_Link(LinkList LA,LinkList LB,LinkList &LC)
{ pa=LA->next; pb=LB->next; while(LA->next!=NULL &&LB->next!=NULL)
{ if(pa->data<=pb->data)
{ LA->next=pa->next; pa->next=LC->next; LC->next=pa; }
else
{ LB->next=pb->next; pb->next=LC->next; LC->next=pb; }
}
while(LA->next!=NULL) //如果LB中结点已经全部处理完,现在只需将LA中结点依次插入到LC中
{ LA->next=pa->next; pa->next=LC->next; LC->next=pa; }
while(LB->next!=NULL) //如果LA中结点已经全部处理完,现在只需将LB中结点依次插入到LC中
{ LB>next=pb->next; pb>next=LC->next; LC->next=pb; } }
2.13有两个元素递增排列的有序表a和b。构造c为交集元素。
void Union_Sq(SqList LA, SqList LB, SqList &LC)
{ i=0;j=0; k=1;
LC.elem[0]=-9999; //LC中第一个元素空间不用,为了操作方便,可设一个顺序表中不存在的值
while(i
{
if(LA.elem[i]<=LB.emem[j]) //如果LA中元素较小,将其插入到LC中
if(LA.elem[i]!=LC.elem[k-1]) //如果LA中当前元素与LC中K前一个元素不相等,则插入当前元素
{ LC.elem[k++]=LA.elem[i++]; LC.length++;}
else i++;
else //如果LB中元素较小,将其插入到LC中
if(LB.elem[j]!=LC.elem[k-1]) //如果LB中当前元素与LC中K前一个元素不相等,则插入当前元素
{ LC.elem[k++]=LB.elem[j++]; LC.length++;}
else j++;
}
while(i
if(LA.elem[i]!=LC.elem[k-1])
{ LC.elem[k++]=LA.elem[i++]; LC.length++;}
while(j
if(LB.elem[j]!=LC.elem[k-1])
{ LC.elem[k++]=LB.elem[j++]; LC.length++;}
}