第一章绪论(参***)
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 是一组有穷的规则,规定了解决某一特定类型问题的一系列运算,是对解题方 与完整的描述。算法是解题的步骤,可以把算法定义成解一确定类问题的任意一种特殊的方法。在计算机科学中...