数据结构与算法答案

发布 2021-05-02 17:20:28 阅读 8261

第一章绪论(参***)

1.3 (1) o(n)

22o(n)

33o(n)

44o(n1/2)

55执行程序段的过程中,x,y值变化如下:

循环次数 x y

0(初始) 91 100

到y=0时,要执行10*100次,可记为o(10*y)=o(n)

1.5 2100 , 2/3)n , log2n , n1/2 , n3/2 , 3/2)n , nlog2n , 2 n , n! ,n n

第二章线性表(参***)

在以下习题解答中,假定使用如下类型定义:

1)顺序存储结构:

#define maxsize 1024

typedef int elemtype;//实际上,elemtype可以是任意类型

typedef struct

elemtype data[maxsize];

int lastlast表示终端结点在向量中的位置

sequenlist;

2)链式存储结构(单链表)

typedef struct node

elemtype data;

struct node *next;

}linklist;

3)链式存储结构(双链表)

typedef struct node

elemtype data;

struct node *prior,*next;

dlinklist;

4)静态链表。

typedef struct

elemtype data;

int next;

node;node sa[maxsize];

2.1 头指针:指向链表的指针。

因为对链表的所有操均需从头指针开始,即头指针具有标识链表的作用,所以链表的名字往往用头指针来标识。如:链表的头指针是la,往往简称为“链表la”。

头结点:为了链表操作统一,在链表第一元素结点(称为首元结点,或首结点)之前增加的一个结点,该结点称为头结点,其数据域不无实际意义(当然,也可以存储链表长度,这只是副产品),其指针域指向头结点。这样在插入和删除中头结点不变。

开始结点:即上面所讲第一个元素的结点。

2.2 只设尾指针的单循环链表,从尾指针出发能访问链表上的任何结点。

void insert(elemtype a,int elenum,elemtype x)

/ 向量a目前有elenum个元素,且递增有序,本算法将x插入到向量a中,并保持向量的递增有序。

int i=0,j;

while (i for (j= elenum-1;j>=i;j--)a[j+1]=a[j];/向后移动元素

a[i]=x; /插入元素

//算法结束。

void rightrotate ( elemtype a,int n,k)

/ 以向量作存储结构,本算法将向量中的n个元素循环右移k位,且只用一个辅助空间。

int num=0计数,最终应等于n

int start=0记录开始位置(下标)

while (num

a[empty]=temp把一轮右移中最后一个元素放到合适位置。

num++;

start起点增1,若num }

//算法结束

算法二。算法思想:先将左面n-k个元素逆置,接着将右面k个元素逆置,最后再将这n个元素逆置。

void rightrotate(elemtype a,int n,k)

/ 以向量作存储结构,本算法将向量中的n个元素循环右移k位,且只用一个辅助空间。

elemtype temp;

for(i=0;i<(n-k)/2;i++)左面n-k个元素逆置。

for(i=1;i<=k;i右面k个元素逆置。

for(i=0;i

//算法结束

void insert(linklist *l,elemtype x)

/ 带头结点的单链表l递增有序,本算法将x插入到链表中,并保持链表的递增有序。

linklist *p=l->next, *pre=l,*s;

/ p为工作指针,指向当前元素,pre为前驱指针,指向当前元素的前驱

s=(linklist *)malloc(sizeof(linklist));申请空间,不判断溢出。

s->data=x;

while (p &&p->data<=x) 查找插入位置

pre->next=s; s->next=p; /插入元素

//算法结束

void invert(linklist *l)

/ 本算法将带头结点的单链表l逆置。

/算法思想是先将头结点从表上摘下,然后从第一个元素结点开始,依次前插入以l为头结点的链表中。

linklist *p=l->next,*s;

/ p为工作指针,指向当前元素,s为p的后继指针

l->next=null;//头结点摘下,指针域置空。算法中头指针l始终不变

while (p)

return(i);

//算法结束。

2) int length1(node sa[maxsize])

/ 本算法计算静态链表s中元素的个数。

int p=sa[0].next, i=0;

/ p为工作指针,指向当前元素,i 表示元素的个数,静态链指针等于-1时链表结束。

while (p!=-1)

return(i);

//算法结束

void union_invert(linklist *a,*b,*c)

/ a和b是两个带头结点的递增有序的单链表,本算法将两表合并成

/ 一个带头结点的递减有序单链表c,利用原表空间。

linklist *pa=a->next,*pb=b->next,*c=a,*r;

/ pa,pb为工作指针,分别指向a表和b表的当前元素,r为当前逆置。

/元素的后继指针, 使逆置元素的表避免断开。

/算法思想是边合并边逆置,使递增有序的单链表合并为递减有序的单链表。

c->next=null;//头结点摘下,指针域置空。算法中头指针c始终不变

while (pa &&pb两表均不空时作

if (pa->data<=pb->data) /将a表中元素合并且逆置

{ r=pa->next保留后继结点的指针

pa->next=c->next; /逆置

c->next=pa;

pa=r恢复待逆置结点的指针

数据结构与算法习题与答案

第1章绪论。习题。1 简述下列概念 数据 数据元素 数据项 数据对象 数据结构 逻辑结构 存储。结构 抽象数据类型。2 试举一个数据结构的例子,叙述其逻辑结构和存储结构两方面的含义和相互关系。3 简述逻辑结构的四种基本关系并画出它们的关系图。4 存储结构由哪两种基本的存储方法实现?5 选择题。1 在...

数据结构与算法习题与答案

第四章习题。p111 113 一 复习题。1 试述数据和数据结构的概念及其区别。数据是对客观事物的符号表示,是信息的载体 数据结构则是指互相之间存在着一种或多种关系的数据元素的集合。p93 2 列出算法的五个重要特征并对其进行说明。算法具有以下五个重要的特征 有穷性 一个算法必须保证执行有限步之后结...

数据结构与算法

本章知识要点 算法的基本概念 数据结构的定义 线性表的定义和存储 树 二叉树的定义和存储 查找与排序算法。算法 algorithm 是一组有穷的规则,规定了解决某一特定类型问题的一系列运算,是对解题方 与完整的描述。算法是解题的步骤,可以把算法定义成解一确定类问题的任意一种特殊的方法。在计算机科学中...