标签:
数据结构教育 |
分类: 学习 |
◆2.11②
设顺序表L中的数据元素递增有序。
试写一算法,将x插入到L的适当位置上,并保
持该表的有序性。
要求实现下列函数:
void InsertOrderList(SqList &L, ElemType
x)
顺序表类型定义如下:
typedef struct {
} SqList;
void InsertOrderList(SqList
&L, ElemType x)
// 在有序的顺序表 L 中保序插入数据元素 x
{ElemType *p;
for(p=&L.elem[L.length-1];*p>x;--p)
}
◆2.12③
设A=(a1,…,am)和B=(b1,…,bn)均为有序顺序表,
A'和B'分别为A和B中除去最大共同前缀后的子表(例如,
A=(x,y,y,z,x,z),B=(x,y,y,z,y,x,x,z),则两者中最大
的共同前缀为(x,y,y,z),在两表中除去最大共同前缀后
的子表分别为A'=(x,z)和B'=(y,x,x,z))。若A'=B'=空表,
则A=B;若A'=空表,而B'≠
空表,或者两者均不为空表,
且A'的首元小于B'的首元,则AB。试写一个比
较A和B大小的算法。(注意:在算法中,不要破坏原表A
和B,也不一定先求得A'和B'才进行比较)。
要求实现下列函数:
char Compare(SqList A, SqList B);
顺序表类型定义如下:
typedef struct {
} SqList;
char
Compare(SqList A, SqList B)
// 比较顺序表A和B,
//
//
//
{ int i;
for(i=1;i<=A.length&&i<=B.length;i++)
}
◆2.13②
试写一算法在带头结点的单链表结构上实现线性表操作
Locate(L,x)。
实现下列函数:
LinkList Locate(LinkList L, ElemType x);
// If 'x' in the linked list whose head node is pointed
// by 'L',
// otherwise return 'NULL'
单链表类型定义如下:
typedef struct LNode {
} LNode, *LinkList;
LinkList Locate(LinkList
&L, ElemType x)
//
//
//
{struct LNode *p;
for(p=L->next;p&&p->data!=x;p=p->next);
}
◆2.14②
试写一算法在带头结点的单链表结构上实现线性表
操作Length(L)。
实现下列函数:
int Length(LinkList L);
// Return the length of the linked list
// whose head node is pointed by 'L'
单链表类型定义如下:
typedef struct LNode{
} LNode, *LinkList;
int Length(LinkList L)
// Return the length of the linked list
// whose head node is pointed by 'L'
{ struct LNode *p;
}
◆2.16③
的首元结点。下列算法是从表la中删除自第i个元素起共
len个元素后,将它们插入到表lb中第i个元素之前。试问
此算法是否正确? 若有错,则请改正之。
实现下列函数:
Status DeleteAndInsertSub(LinkList &la, LinkList
&lb,
//
la和lb分别指向两个单链表中第一个结点,
单链表类型定义如下:
typedef struct LNode{
} LNode, *LinkList;
Status
DeleteAndInsertSub(LinkList &la, LinkList
&lb,
//
la和lb分别指向两个单链表中第一个结点,
{LNode *p,*q,*r,*t;
}
}
◆2.19③
单链表作存储结构。试写一高效的算法,删除表中所有值
大于mink且小于maxk的元素(若表中存在这样的元素)同时
释放被删结点空间,并分析你的算法的时间复杂度(注意:
mink和maxk是给定的两个参变量,它们的值可以和表中的
元素相同,也可以不同)。
实现下列函数:
void DeleteSome(LinkList &L, ElemType mink,
ElemType maxk);
单链表类型定义如下:
typedef struct LNode{
} LNode, *LinkList;
void DeleteSome(LinkList
&L, ElemType mink, ElemType maxk)
{
}
◆2.20②
有值相同的多余元素
(使得操作后的线性表中所有元素的
值均不相同)
同时释放被删结点空间,并分析你的算法的
时间复杂度。
实现下列函数:
void Purge(LinkList &L);
单链表类型定义如下:
typedef struct LNode{
} LNode, *LinkList;
void Purge(LinkList
&L)
{LNode *p,*q;
}
◆2.21③
试写一算法,实现顺序表的就地逆置,
即利用原表的存储空间将线性表(a1,a2,…,an)
逆置为(an,an-1,…,a1)。
实现下列函数:
void Inverse(SqList &L);
顺序表类型定义如下:
typedef struct {
} SqList;
void Inverse(SqList
&L)
{int i,j=L.length-1;
}
◆2.22③
实现下列函数:
void Inverse(LinkList &L);
单链表类型定义如下:
typedef struct LNode{
} LNode, *LinkList;
void Inverse(LinkList
&L)
{ struct LNode *p,*q,*s;
p=L->next;q=p->next;s=q->next;p->next=NULL;
}
◆2.23③ 设线性表A=(a1,...,am),
B=(b1,...,bn),试写
一个按下列规则合并A、B为线性表C的算法,即使得
或者
线性表A、B和C均以单链表作存储结构,且C表利用A表和
B表中的结点空间构成。注意:单链表的长度值m和n均未
显式存储。
实现下列函数:
void Merge(LinkList ha, LinkList hb, LinkList
&hc)
单链表类型定义如下:
typedef struct LNode{
} LNode, *LinkList;
void Merge(LinkList ha, LinkList hb,
LinkList &hc)
{ struct LNode *p,*q,*s,*t;
p=ha->next;q=hb->next;hc=ha;
}
◆2.26④
A和B分别表示两个集合(即同一表中的元素值各不相
同),现要求另辟空间构成一个线性表C,其元素为A
和B中元素的交集,且表C中的元素也依值递增有序排
列。试对单链表编写求C的算法。
实现下列函数:
void Intersect(LinkList &hc, LinkList ha, LinkList
hb);
单链表类型定义如下:
typedef struct LNode{
} LNode, *LinkList;
void Intersect(LinkList
&hc, LinkList ha, LinkList hb)
{ struct LNode *p,*q,*pc,*s;
}
◆2.31②
中既无头结点也无头指针。已知s为指向链表中某个
结点的指针,试编写算法在链表中删除指针s所指结
点的前驱结点。
实现下列函数:
ElemType DeleteNode(LinkList s);
单链表类型定义如下:
typedef struct LNode{
} LNode, *LinkList;
ElemType DeleteNode(LinkList s)
{ LNode *p,*q;
}
◆2.32②
含三个域:prev、data和next,其中data为数据域,
next为指向后继结点的指针域,prev也为指针域,
但它的值为空(NULL),试编写算法将此单向循环链
表改为双向循环链表,即使prev成为指向前驱结点
的指针域。
实现下列函数:
void PerfectBiLink(BiLinkList &CL);
双向循环链表类型定义如下:
typedef struct BiNode {
} BiNode, *BiLinkList;
void PerfectBiLink(BiLinkList
&CL)
{ struct BiNode *p;
◆2.33③
三类字符的数据元素(如:字母字符、数字字符和其
它字符),试编写算法将该线性链表分割为三个循环
链表,其中每个循环链表表示的线性表中均只含一类
字符。
实现下列函数:
void Split(LinkList &lc, LinkList
&ld, LinkList &lo, LinkList
ll);
单链表类型定义如下:
typedef struct LNode{
} LNode, *LinkList;
void Split(LinkList &lc,
LinkList &ld, LinkList &lo,
LinkList ll)
{
}
◆2.37④
表L=(a1,a2,...,an)。试写一时间复杂度为O(n)的
算法,将L改造为L=(a1,a3,...,an,...,a4,a2)。
实现下列函数:
void ReverseEven(BiLinkList &L);
双向循环链表类型定义如下:
typedef struct BiNode {
} BiNode, *BiLinkList;
void ReverseEven(BiLinkList
&L)
{BiNode *p,*q,*r,*s;
}
◆2.39③
数m成正比的顺序存储结构,编写求Pn(x0)的算法(x0为
给定值),并分析你的算法的时间复杂度。
实现下列函数:
float Evaluate(SqPoly pn, float x);
多项式的顺序存储结构:
typedef struct {
} PolyTerm;
typedef struct {
} SqPoly;
float Evaluate(SqPoly pn, float x)
{ float sum,xp;
}
◆2.41②
编写求其导函数的算法,要求利用原多项式中的结
点空间存放其导函数(多项式),同时释放所有无
用(被删)结点。
实现下列函数:
void Difference(LinkedPoly &pa);
链式多项式的类型定义:
typedef struct PolyNode {
} PolyNode, *PolyLink;
typedef PolyLink LinkedPoly; //
链式多项式
void Difference(LinkedPoly
&pa)
{PolyNode *p;
}