最新数据结构算法设计期末复习题资料
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
二、算法设计
1、设计一个算法,通过一趟遍历在单链表中确定值最大的结点。
ElemType Max (LinkList L ){
if(L->next==NULL) return NULL;
pmax=L->next; //假定第一个结点中数据具有最大值
p=L->next->next;
while(p != NULL ){//如果下一个结点存在
if(p->data > pmax->data) pmax=p; p=p->next; }
return pmax->data;
2、设计一个算法,通过遍历一趟,将链表中所有结点的链接方向逆转,仍利用原表的存储空间。
void inverse(LinkList &L) { // 逆置带头结点的单链表L
p=L->next;
L->next=NULL;
while ( p) {
q=p->next; // q指向*p的后继
p->next=L->next;
L->next=p; // *p插入在头结点之后
p = q;
}
}
3、设计一个算法,删除递增有序链表中值大于mink且小于maxk的所有元素(mink和maxk 是给定的两个参数,其值可以和表中的元素相同,也可以不同)。
void delete(LinkList &L, int mink, int maxk) {
p=L->next; //首元结点
while (p && p->data<=mink)
{ pre=p; p=p->next; } //查找第一个值>mink的结点
if (p) {
while (p && p->data
// 查找第一个值≥maxk 的结点
q=pre->next; pre->next=p; // 修改指针
while (q!=p)
{ s=q->next; delete q; q=s; } // 释放结点空间
}
//if }
4、假设某个单向循环链表的长度大于1,且表中既无头结点也无头指针。已知s为指向链表中某个结点的指针,试编写算法在链表中删除指针s所指结点的前驱结点。
typedef struct LNode{
ElemType data;
struct LNode *next; }
LNode, *LinkList;
ElemType DeleteNode(LinkList s)
/* 删除指针s所指结点的前驱结点,并返回被删结点的元素值*/ {
LinkList p; p=s->next;
while(p->next->next!=s)
p=p->next;
ElemType e=p->next->data;
p->next=s; return e; }
5、已知长度为n的线性表A采用顺序存储结构,请写一时间复杂度为0(n)、空间复杂度为0(1)的算法,该算法删除线性表中所有值为item的数据元素。
void DeleteItem(SeqList *L,ElemType item) {
int i=0,j=L->last;
while(i while(i if(i L->last=i-1; } 6、写一个算法,求出循环链表结点的个数。(不包括头结点) int count(Linklist head) { int n=0; ListNode.p=head->next; while(p!=head) {n++;P=P->next;} return n;} 7、写一算法在单链表上实现线性表的ListLength(L)运算。 int ListLength ( LinkList L ) {int len=0 ; ListNode *p; p=L; //设该表有头结点 while ( p->next ) {p=p->next; len++;} return len;} 8、试写一算法计算二叉树的深度(高度)。 int Height(btre bt)/求二叉树bt的深度 {int hl,hr; if(bt==null) return(0); else {hI=Height(bt->lch); hr=Height(bt->rch); if(hl>hr) return (hl+1); else return(hr+1);}} 9、试写一算法统计用二叉链表表示的二叉树叶子结点总数。 int leaf ( BinTreeNode if ( ptr == NULL ) return 0; else if ( ptr->leftChild == NULL && ptr->rightChild == NULL ) return 1; else return leaf ( ptr->leftChild ) + leaf ( ptr->rightChild ); } 10、已知二叉树的定义如下: typedef struct node{ int data; struct node *lchild, *rchild; }*bitree; 试分别写出二叉树的后根遍历和中根遍历的递归算法。 后 int visit (bitree T) { if(T==null) return 0; visit (T->lchirld); visit (T->rchirld); printf(“%d”,data); } 中 int visit (bitree T) { if(T==null) return 0; visit (T->lchirld); printf(“%d”,data); visit (T->rchirld); } 11、已知二叉树的定义如下: typedef struct node{ int data; struct node *lchild, *rchild; }*bitree; 编写二叉树先序遍历的递归算法。 先 int visit (bitree T)