最新数据结构算法设计期末复习题资料

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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->datanext;

// 查找第一个值≥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(ielem[i]!=item) i++; while(ielem[i]==item) j--;

if(ielem[i]=L->elem[j]; i++; j--;} }

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 * ptr ) {

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)

相关文档
最新文档