数据结构(c语言版)第三版习题解答

数据结构(c语言版)第三版习题解答
数据结构(c语言版)第三版习题解答

数据结构

(C语言版)(第3版)

习题解析

揭安全李云清杨庆红编著

江西师范大学计算机信息工程学院

联系方式:jieanquan@https://www.360docs.net/doc/768603122.html,

2012年12月

第1章绪论

1.1什么是数据结构?

【答】:数据结构是指按一定的逻辑结构组成的一批数据,使用某种存储结构将这批数据存储于计算机中,并在这些数据上定义了一个运算集合。

1.2 数据结构涉及哪几个方面?

【答】:数据结构涉及三个方面的内容,即数据的逻辑结构、数据的存储结构和数据的运算集合。

1.3 两个数据结构的逻辑结构和存储结构都相同,但是它们的运算集合中有一个运算的定义不

一样,它们是否可以认作是同一个数据结构?为什么?

【答】:不能,运算集合是数据结构的重要组成部分,不同的运算集合所确定的数据结构是不一样的,例如,栈与队列它们的逻辑结构与存储结构可以相同,但由于它们的运算集合不一样,所以它们是两种不同的数据结构。

1.4 线性结构的特点是什么?非线性结构的特点是什么?

【答】:线性结构元素之间的关系是一对一的,在线性结构中只有一个开始结点和一个终端结点,其他的每一个结点有且仅有一个前驱和一个后继结点。而非线性结构则没有这个特点,元素之间的关系可以是一对多的或多对多的。

1.5 数据结构的存储方式有哪几种?

【答】:数据结构的存储方式有顺序存储、链式存储、散列存储和索引存储等四种方式。

1.6 算法有哪些特点?它和程序的主要区别是什么?

【答】:算法具有(1)有穷性(2)确定性(3)0个或多个输入(4)1个或多个输出(5)可

行性等特征。程序是算法的一种描述方式,通过程序可以在计算机上实现算法。

1.7 抽象数据类型的是什么?它有什么特点?

【答】:抽象数据类型是数据类型的进一步抽象,是大家熟知的基本数据类型的延伸和发展。抽象数据类型是与表示无关的数据类型,是一个数据模型及定义在该模型上的一组运算。对一个抽象数据类型进行定义时,必须给出它的名字及各运算的运算符名,即函数名,并且规定这些函数的参数性质。一旦定义了一个抽象数据类型及具体实现,程序设计中就可以像使用基本数据类型那样,十分方便地使用抽象数据类型。抽象数据类型的设计者根据这些描述给出操作的具体实现,抽象数据类型的使用者依据这些描述使用抽象数据类型。

1.8 算法的时间复杂度指的是什么?如何表示?

【答】:算法执行时间的度量不是采用算法执行的绝对时间来计算的,因为一个算法在不同的机器上执行所花的时间不一样,在不同时刻也会由于计算机资源占用情况的不同,使得算法在同一台计算机上执行的时间也不一样,另外,算法执行的时间还与输入数据的状态有关,所以对于算法的时间复杂性,采用算法执行过程中其基本操作的执行次数,称为计算量来度量。算法中基本操作的执行次数一般是与问题规模有关的,对于结点个数为n的数据处理问题,用

T(n)表示算法基本操作的执行次数。为了评价算法的执行效率,通常采用大写O符号表示算法

的时间复杂度,大写O符号给出了函数f的一个上限。其它义如下:

定义:f (n)=O (g (n)) 当且仅当存在正的常数c和n0,使得对于所有的n≥n0,有f (n) ≤c g(n)。

上述定义表明,函数f顶多是函数g的c倍,除非n 小于n0。因此对于足够大的n (如n≥n0),g是f 的一个上限(不考虑常数因子c)。在为函数f 提供一个上限函数g 时,通常使用比较

简单的函数形式。比较典型的形式是含有n的单个项(带一个常数系数)。表1-1列出了一些

常用的g函数及其名称。对于表1-1中的对数函数logn,没有给出对数基,原因是对于任何大

于1的常数a和b都有logan =logbn/logba,所以logan和logbn都有一个相对的乘法系数1/logba,

其中a是一个常量。

表1-1常用的渐进函数

函数名称

1 常数

logn 对数

n 线性

nlogn n个logn

n2 平方

n3 立方

2n 指数

n! 阶乘

1.9 算法的空间复杂度指的是什么?如何表示?

【答】:算法的空间复杂度是指算法在执行过程中占用的额外的辅助空间的个数。可以将它表示为问题规模的函数,并通过大写O符号表示空间复杂度。

1.10 对于下面的程序段,分析带下划线的语句的执行次数,并给出它们的时间复杂度T(n)。

(1)i++;

(2)for(i=0;i

if (a[i]

(3)for(i=0;i

for(j=0;j

printf(“%d”,i+j);

(4)for (i=1;i<=n-1;i++)

{ k=i;

for(j=i+1;j<=n;j++)

if(a[j]>a[j+1]) k=j;

t=a[k]; a[k]=a[i]; a[i]=t;

}

(5)for(i=0;i

for(j=0;j

{++x;s=s+x;}

【答】:(1)O(1);(2)O(n);(3)O(n2);(4)O(n2);(5)O(n2)

第2章线性表及其顺序存储

2.1 选择题

(1)表长为n的顺序存储的线性表,当在任何位置上插入或删除一个元素的概率相等时,插入一个元素所需移动元素的平均个数为( E ),删除一个元素所需移动元素的平均个数

为(A )。

A.(n?1)/2 B.n C.n+1 D.n?1

E.n/2 F.(n+1)/2 G.(n?2)/2

(2)设栈S和队列Q的初始状态为空,元素e1、e2、e3、e4、e5和e6依次通过栈S,

一个元素出栈后即进入队列Q,若6个元素出队的序列为e2、e4、e3、e6、e5和e1,则栈S

的容量至少应该为( C )。

A.6 B.4 C.3 D.2

(3)设栈的输入序列为1、2、3… n,若输出序列的第一个元素为n,则第i个输出的元素为(B )。

A.不确定B.n?i+1 C.i D.n?i

(4)在一个长度为n的顺序表中删除第i个元素(1<=i<=n)时,需向前移动(A )个

元素。

A.n?i B.n?i+1 C.n?i?1 D.i

(5)若长度为n的线性表采用顺序存储结构存储,在第i个位置上插入一个新元素的时

间复杂度为(A )。

A.O(n) B.O(1) C.O(n2) D.O(n3)

(6)表达式a*(b+c)?d的后缀表达式是(B )。

A.abcd*+? B.abc+*d? C.abc*+d? D.?+*abcd

(7)队列是一种特殊的线性表,其特殊性在于( C )。

A.插入和删除在表的不同位置执行B.插入和删除在表的两端位置执行

C.插入和删除分别在表的两端执行D.插入和删除都在表的某一端执行(8)栈是一种特殊的线性表,具有( B )性质。

A.先进先出B.先进后出C.后进后出D.顺序进出

(9)顺序循环队列中(数组的大小为n),队头指示front指向队列的第1个元素,队尾

指示rear指向队列最后元素的后1个位置,则循环队列中存放了n 1个元素,即循环队列满

的条件为(B )。

A.(rear+1)%n=front?1 B.(rear+1)%n=front

C.(rear)%n=front D.rear+1=front

(10)顺序循环队列中(数组的大小为6),队头指示front和队尾指示rear的值分别为3

和0,当从队列中删除1个元素,再插入2个元素后,front和rear的值分别为(D )。

A.5和1 B.2和4 C.1和5 D.4和2

2.2什么是顺序表?什么是栈?什么是队列?

【答】:当线性表采用顺序存储结构时,即为顺序表。栈是一种特殊的线性表,它的特殊性表现在约定了在这种线性表中数据的插入与删除操作只能在这种线性表的同一端进行(即栈顶),因此,栈具有先进后出、后进先出的特点。队列也是一种特殊的线性表,它的特殊性表现在约定了在这种线性表中数据的插入在表的一端进行,数据的删除在表的另一端进行,因此队列具有先进先出,后进后出的特点。

2.3设计一个算法,求顺序表中值为x的结点的个数。

【答】:顺序表的存储结构定义如下:

#include

#define N 100 /*预定义最大的数据域空间*/

typedef int datatype; /*假设数据类型为整型*/

typedef struct {

datatype a[N]; /*此处假设数据元素只包含一个整型的关键字域*/

int size; /*线性表长度*/

} sequence_list; /*预定义的顺序表类型*/

算法count()用于求顺序表H中值为x的结点的个数。

int count (sequence_list *H,datatype x)

{ int j=0;

int i;

for (i=0;isize;i++)

if (H->a[i]==x) j++;

return j;

}

2.4 设计一个算法,将一个顺序表倒置。即,如果顺序表各个结点值存储在一维数组a中,倒

置的结果是使得数组a中的a[0]等于原来的最后一个元素,a[1] 等于原来的倒数第2个元

素,…,a的最后一个元素等于原来的第一个元素。

【答】:实现顺序表倒置的算法程序如下:

void verge(seqlist *L)

{int t,i,j;

i=0;

j=L->length-1;

while (i

{ t=L->data[i];

L->data[i++]=L->data[j];

L->data[j--]=t;

}

}

2.5已知一个顺序表中的各结点值是从小到大有序的,设计一个算法,插入一个值为x的结点,

使顺序表中的结点仍然是从小到大有序。

【答】:实现本题要求的算法程序如下:

void insertx(seqlist *L,datatype x)

{int j;

if (L->length

{ j=L->length-1;

while (j>=0 && L->data[j]>x)

{ L->data[j+1]=L->data[j];

j--;

}

L->data[j+1]=x;

L->length++;

}

}

2.6 将下列中缀表达式转换为等价的后缀表达式。

(1) 5+6*7

(2) (5-6)/7

(3) 5-6*7*8

(4) 5*7-8

(5) 5*(7-6)+8/9

(6) 7*(5-6*8)-9

【答】:

(7) 5+6*7 后缀表达式:5 6 7*+

(8) (5-6)/7 后缀表达式:5 6-7/

(9) 5-6*7*8 后缀表达式:5 6 7*8*-

(10) 5*7-8 后缀表达式:5 7* 8-

(11) 5*(7-6)+8/9 后缀表达式:5 7 6-*8 9/+

(12) 7*(5-6*8)-9 后缀表达式:7 5 6 8*-*9-

2.7 循环队列存储在一个数组中,数组大小为n,队首指针和队尾指针分别为front和rear,请写出求循环队列中当前结点个数的表达式。

【答】:循环队列中当前结点个数的计算公式是:(n+rear-front)%n

2.8编号为1,2,3,4的四列火车通过一个栈式的列车调度站,可能得到的调度结果有哪些?如果有n列火车通过调度站,请设计一个算法,输出所有可能的调度结果。

【答】:

方法一:

算法思想:逐次输出所有可能,用回溯法。即:

总体:对原始序列中的每一个元素,总是先入栈,后出栈

1.入栈后的操作:a.该元素出栈;b.下一个元素入栈;

2.出栈后的操作:a.(栈中其他元素)继续出栈;b. (原始序列中)下一个数入栈;

注意:回溯法,关键在于回溯,即在某分支结点X:处理X的一个子分支,再退回分支X,

接着处理X的下一个子分支,若所有X的子分支处理完,再退回上一层分支节点。所谓“退回”,

实际上就是恢复。

程序代码:(2_8_1.c)

#include

#define MAX 26

typedef struct s{

char a[MAX];

int top;

}Stack;

/*定义一些全局变量*/

Stack S; /*定义全局性的栈*/

char d[MAX],seq[MAX]; /*d[MAX]用于存储原始入栈序列,seq[MAX]用于存储输出序列*/ int len; /*定义将通过栈的元素个数*/

int count=0; /* 用于统计输出序列的个数*/

void initStack(Stack *S) /*初始化空栈*/

{ S->top=-1; }

void push(Stack *S, char x) /*进栈*/

{ if (S->top>=MAX) return;

S->top++;

S->a[S->top]=x;

}

char pop(Stack *S)/*出栈*/

{ if (S->top==-1)

{ printf("ERROR, POP Empty Stack");

return -1;

}

S->top--;

return S->a[S->top+1];

}

int isEmpty(Stack *S)/*判断栈是否为空*/

{ if (S->top==-1) return 1;

return 0;

}

void outSeq(char *seq, int len)/*输出顶点序列*/

{ int i;

for(i=0; i

printf("%2c",seq[i]);

printf("\n");

}

void scheduler(int pos, int seq_pos)

{ /* pos: 处理到原始数据中的第pos个元素,

seq_pos:若出栈,应放在当前输出数组的第seq_pos个位置

*/

int i=0;char t;

/*对任何一个数,总是先进栈,再出栈。另外,这里不需要循环,类似于“查找数组中元素”用递归*/

if(pos

scheduler(pos+1,seq_pos);

pop(&S);

}

if (!isEmpty(&S)){/*一个数出栈后,有两种处理方式:要么继续出栈,要么继续下一个数的进栈*/

t=pop(&S);

seq[seq_pos++]=t;

scheduler(pos,seq_pos);

push(&S,t);

}

if (pos>=len && isEmpty(&S))

{ outSeq(seq,len); count++; }

}

int main(){

int i;

printf("\nplease input the num be scheduled: ");

scanf("%d", &len); /*用len存储待调度的火车数量*/

for(i=0; i

d[i]='a'+i; /*创建火车编号,如a、b、c、...等*/

printf("the original seq is:");

outSeq(d,len);

initStack(&S);

scheduler(0,0);

printf("\n count=%5d", count);

return 0;

}

方法二:

解题思路:栈具有先进后出、后进先出的特点,因此,任何一个调度结果应该是1,2,3,4全排列中的一个元素。由于进栈的顺序是由小到大的,所以出栈序列应该满足以下条件:对于序列中的任何一个数其后面所有比它小的数应该是倒序的,例如4321是一个有效的出栈序

列,1423不是一个有效的出栈结果(4后面比它小的两个数2,3不是倒序)。据此,本题可以通过算法产生n个数的全排列,然后将满足出栈规则的序列输出。

产生n个数的全排列有递归与非递归两种实现算法。

产生全排列的递归算法:

设R={r1,r2,…,rn}是要进行排列的n个元素,Ri=R-{ri}。集合X中元素的全排列记为perm(X)。(ri)perm(X)表示在全排列perm(X)的每一个排列前加上前缀ri得到的排列。R的全排列可归纳定义如下:

当n=1时,perm(R)=(r),其中r是集合R中惟一的元素;

当n>1时,perm(R)由(r1)perm(R1),(r2)perm(R2),…,(rn)perm(Rn)构成。

依此递归定义,可设计产生perm(R)的递归算法如下:

递归解法:(2_8_2.c)

#include

int cont=1; /*全局变量,用于记录所有可能的出栈序列个数*/

void print(int str[],int n);

/*求整数序列str[]从k到n的全排列*/

void perm(int str[],int k,int n)

{int i,temp;

if (k==n-1) print(str,n);

else

{ for (i=k;i

{temp=str[k]; str[k]=str[i]; str[i]=temp;

perm(str,k+1,n); /*递归调用*/

temp=str[i]; str[i]=str[k]; str[k]=temp;

}

}

}

/*本函数判断整数序列str[]是否满足进出栈规则,若满足则输出*/

void print(int str[],int n)

{int i,j,k,l,m,flag=1,b[2];

for(i=0;i

{ m=0;

for(j=i+1;j

if (str[i]>str[j]) {if (m==0) b[m++]=str[j];

else {if (str[j]>b[0]) {flag=0;}

else b[0]=str[j];

}

}

}

if(flag) /*满足出栈规则则输出str[]中的序列*/

{ printf(" %2d:",cont++);

for(i=0;i

printf("%d",str[i]);

printf("\n");

}

}

int main()

{int str[100],n,i;

printf("input a int:"); /*输出排列的元素个数*/

scanf("%d",&n);

for(i=0;i

str[i]=i+1;

printf("input the result:\n");

perm(str,0,n);

printf("\n");

return 0;

}

当参与进出栈的元素个数为4时,输出的结果如下图所示。

该算法执行的时间复杂度为O(n!)。随着n的增大,算法的执行效率非常的低。

非递归解法:(2_8_3.c)

对一组数穷尽所有排列,还可一种更直接的方法,将一个排列看作一个长整数,则所有排列对应着一组整数,将这组整数按从小到大的顺序排成一个数列,从对应最小的整数开始,按数列的递增顺序逐一列举每个排列对应的每一个整数,这能更有效地完成排列的穷举。从一个排列找出对应数列的下一个排列可在当前排列的基础上作部分调整来实现。倘若当前排列为1,2,4,6,5,3,并令其对应的长整数为124653。要寻找比长整数124653更大的排列,可从该排列的最后一个数字顺序向前逐位考察,当发现排列中的某个数字比它前一个数字大时,如本例中的6比它的前一位数字4大,则说明还有可能对应更大整数的排列。但为顺序从小到大列举出所有的排列,不能立即调整得太大,如本例中将数字6与数字4交换得到的排列为126453就

不是排列124653的下一个排列。为得到排列124653的下一个排列,应从已考察过的那部分数

字中选出比数字4大,但又是它们中最小的那一个数字,比如数字5,与数字4交换。该数字也是从后向前考察过程中第一个比4大的数字,5与4交换后,得到排列125643。在前面数字1,2,5固定的情况下,还应选择对应最小整数的那个排列,为此还需将后面那部分数字的排列颠倒,如将数字6,4,3的排列顺序颠倒,得到排列1,2,5,3,4,6,这才是排列1,2,4,6,5,3的下一个排列。按照以上想法可以编写非递归程序实现n个数的全排列,对满足进出栈规则的排列则计数并输出。

/*本程序输出1 2 ... n个序列进栈出栈的序列*/

#include

int pl(int n)

{ int a[100]; /*最大处理范围为99个数*/

int flag=1,flag1=0;

FILE *rf ;

int i,j,k,x,count=0;

rf = fopen("stack.txt", "w") ; /*pl.txt用于存放进出栈序列结果*/

for (i=1;i<=n;i++) /*初始序列*/

a[i]=i;

while (flag) /* 还剩余未输出的排列*/

{ flag1=1; /* 判断本次排列是否符合进栈出栈序列*/

for (i=1;i<=n;i++)

{ j=i+1;

while (j<=n && a[j]>a[i]) j++; /* 找a[i]后第一个比a[i]小的元素a[j]*/

k=j+1;

while (k<=n) /* 如果a[j]后还有比a[i]小且比a[j]大的元素,则此排列无效*/

{if ( a[k] a[j]) flag1=0;

k++;

}

}

if (flag1)

{ for (i=1;i<=n;i++) /*输出当前排列*/

{ printf("%4d",a[i]); fprintf(rf,"%4d",a[i]);}

printf("\n"); fprintf(rf,"\n");

count++; /*计数器加1*/

}

i=n; /*从后向前找相邻位置后大前小的元素值*/

while (i>1 && a[i]

if (i==1) flag=0; /*未找到则结束*/

else

{j=i-1;i=n;/* 若找到,则在该位置的后面从右向左找第一个比该元素大的值*/

while (i>j && a[i]

k=a[j]; /*交换两元素的值*/

a[j]=a[i];

a[i]=k;

k=j+1; /*对交换后后面的数据由小到大排序*/

for ( i=k+1;i<=n;i++) /*插入排序*/

{ j=i-1;

x=a[i];

while (j>=k && x

a[j+1]=x;

}

}

}

fclose(rf);

return count; /*返回排列总个数*/

}

void main()

{int n,m=0;

printf("please input n:"); /*输入排列规模*/

scanf("%d",&n);

m=pl(n);

printf("\nm=%d",m); /*输出满足进出栈的排列总个数*/

}

程序运行时如果输入4,则输出的结果如下图所示。

该算法的时间复杂度也是O(n!)。

结论:如果n 个数按编号由小到大的顺序进栈,进栈的过程中可以出栈,则所有可能的出栈序

列的总数为: !!)1(

)!2(

nnn n

第3章线性表的链式存储

3.1 选择题

(1)两个有序线性表分别具有n个元素与m个元素且n≤m,现将其归并成一个有序表,

其最少的比较次数是( A )。

A.n B.m C.n?1 D.m+n

(2)非空的循环单链表head的尾结点(由p所指向)满足(C )。

A.p->next==NULL B.p==NULL C.p->next==head D.p==head

(3)在带头结点的单链表中查找x应选择的程序体是(C )。

A.node *p=head->next; while (p && p->info!=x) p=p->next;

if (p->info==x) return p else return NULL;

B.node *p=head; while (p&& p->info!=x) p=p->next; return p;

C.node *p=head->next; while (p&&p->info!=x) p=p->next; return p;

D.node *p=head; while (p->info!=x) p=p->next ; return p;

(4)线性表若采用链式存储结构时,要求内存中可用存储单元的地址( D )。

A.必须是连续的B.部分地址必须是连续的

C.一定是不连续的D.连续不连续都可以

(5)在一个具有n个结点的有序单链表中插入一个新结点并保持单链表仍然有序的时间

复杂度是(B )。

A.O(1) B.O(n) C.O(n2) D.O(nlog2n)

(6)用不带头结点的单链表存储队列时,其队头指针指向队头结点,其队尾指针指向队

尾结点,则在进行删除操作时( D )。

A.仅修改队头指针B.仅修改队尾指针

C.队头、队尾指针都要修改D.队头,队尾指针都可能要修改

(7)若从键盘输入n个元素,则建立一个有序单向链表的时间复杂度为( B )。

A.O(n) B.O(n2) C.O(n3) D.O(n×log2n)

(8)下面哪个术语与数据的存储结构无关( D )。

A.顺序表B.链表C.散列表D.队列

(9)在一个单链表中,若删除p所指结点的后续结点,则执行( A )。

A.p->next=p->next->next; B.p=p->next; p->next=p->next->next;

C.p->next=p->next; D.p =p->next->next;

(10)在一个单链表中,若p所指结点不是最后结点,在p之后插入s所指结点,则执行(B )。

A.s->next=p;p->next=s; B.s->next=p->next;p->next=s;

C.s->next=p->next;p=s; D.p->next=s;s->next=p;

3.2 设计一个算法,求一个单链表中的结点个数。

【答】:单链表存储结构定义如下(相关文件:linklist.h)

#include

#include

typedef struct node

{ int data;

struct node *next;

}linknode;

typedef linknode *linklist;

/*尾插法创建带头结点的单链表*/

linklist creatlinklist()

{ linklist head,r,s;

int x;

head=r=(linklist)malloc(sizeof(linknode));

printf("\n请输入一组以0结束的整数序列:\n");

scanf("%d",&x);

while (x)

{ s=(linklist)malloc(sizeof(linknode));

s->data=x;

r->next=s;

r=s;

scanf("%d",&x);

}

r->next=NULL;

return head;

}

/*输出带头结点的单链表*/

void print(linklist head)

{ linklist p;

p=head->next;

printf("List is:\n");

while(p)

{ printf("%5d",p->data);

p=p->next;

}

printf("\n");

}

基于上述结构定义,求单链表中的结点个数的算法程序如下:int count(linklist head)

{ int c=0;

linklist p=head;

while (p)

{c++;

p=p->next;

}

return c;

}

3.3设计一个算法,求一个带头结点单链表中的结点个数。

【答】:带头结点的单链表的存储结构定义同题3.2,实现本题功能的算法程序如下(3_3.c)#include "linklist.h"

int count(linklist head)

{ int c=0;

linklist p=head->next;

while (p)

{c++;

p=p->next;

}

return c;

}

main() /*测试函数*/

{linklist head;

head=creatlinklist();

print(head);

printf("\nLength of head is:%d",count(head));

getch();

}

当输入5个数据时,产生的输出结果如下图所示:

3.4设计一个算法,在一个单链表中值为y的结点前面插入一个值为x的结点。即使值为x的

新结点成为值为y的结点的前驱结点。

【答】:

#include "linklist.h"

void insert(linklist head,int y,int x)

{/*在值为y的结点前插入一个值为x的结点*/

linklist pre,p,s;

pre=head;

p=head->next;

while (p && p->data!=y)

{ pre=p;

p=p->next;

}

if (p)/*找到了值为y的结点*/

{ s=(linklist)malloc(sizeof(linknode));

s->data=x;

s->next=p;

pre->next=s;

}

}

void main() /*测试程序*/

{linklist head;

int y,x;

head=creatlinklist(); /*创建单链表*/

print(head); /*输出单链表*/

printf("\n请输入y与x的值:\n");

scanf("%d %d",&y,&x);

insert(head,y,x);

print(head);

}

程序的一种运行结果如下图所示:

3.5设计一个算法,判断一个单链表中各个结点值是否有序。

【答】:

#include "linklist.h"

int issorted(linklist head,char c)

/*当参数c=’a’时判断链表是否为升序,当参数c=’d’是判断链表是否为降序*/ { int flag=1;

linklist p=head->next;

switch (c)

{case 'a':/*判断带头结点的单链表head是否为升序*/

while (p &&p->next && flag)

{if (p->data<=p->next->data) p=p->next;

else flag=0;

}

break;

case 'd':/*判断带头结点的单链表head是否为降序*/

while (p &&p->next && flag)

{if (p->data>=p->next->data) p=p->next;

else flag=0;

}

break;

}

return flag;

}

int main() /*测试程序*/

{ linklist head;

head=creatlinklist();

print(head);

if (issorted(head,'a')) printf("单链表head是升序排列的!\n");

else

if (issorted(head,'d')) printf("单链表head是降序排列的!\n");

else printf("单链表head是无序的!\n");

}

程序运行时的三种输出结果如下图所示:

3.6设计一个算法,利用单链表原来的结点空间将一个单链表就地转置。【答】:

#include "linklist.h"

void verge(linklist head)

{/*本函数的功能是就地倒置带头结点的单链表*/

linklist p,q;

p=head->next;

head->next=NULL;

while (p) /*每次从原表取一个结点插入到新表的最前面*/

{q=p;

p=p->next;

q->next=head->next;

head->next=q;

}

}

int main() /*测试函数*/

{linklist head;

head=creatlinklist(); /*创建单链表*/

print(head); /*输出原单链表*/

verge(head); /*就地倒置单链表*/

print(head); /*输出倒置后的单链表*/

}

3.7设计一个算法,将一个结点值自然数的单链表拆分为两个单链表,原表中保留值为偶数的结点,而值为奇数的结点按它们在原表中的相对次序组成一个新的单链表。

【答】:

#include "linklist.h"

linklist sprit(linklist head)

{ /*将带头结点的单链表head中的奇数值结点删除生成新的单链表并返回*/

linklist L,pre,p,r;

L=r=(linklist)malloc(sizeof(linknode));

r->next=NULL;

pre=head;

p=head->next;

while (p)

{ if (p->data%2==1) /*删除奇数值结点*/

{ pre->next=p->next;

r->next=p;

r=p;

p=pre->next;

}

else /*保留偶数值结点*/

{ pre=p;

p=p->next;

}

}

r->next=NULL; /*置链表结束标记*/

return L;

}

int main() /*测试函数*/

{linklist head,L;

head=creatlinklist(); /*创建单链表*/

print(head); /*输出原单链表*/

L=sprit(head); /*分裂单链表head*/

printf("\n原单链表为:\n");

print(head); /*输出倒置后的单链表*/

printf("\n分裂所得奇数单链表为:\n");

print(L);

}

本程序的一组测试情况如下图所示。

3.8设计一个算法,对一个有序的单链表,删除所有值大于x而不大于y的结点。【答】:

#include "linklist.h"

void deletedata(linklist head,datatype x,datatype y)

{ /*删除带头结点单链表中所有结点值大于x而不大于y的结点*/

linklist pre=head,p,q;

p=head->next; /*初始化*/

while (p && p->data<=x) /*找第1处大于x的结点位置*/

{ pre=p;

p=p->next;

}

while (p && p->data<=y) /*找第1处小于y的位置*/

p=p->next;

q=pre->next; /*删除大于x而小于y的结点*/

pre->next=p;

pre=q->next;

while (pre!=p) /*释放被删除结点所占用的空间*/

{free(q);

q=pre;

pre=pre->next;

}

}

void main() /*测试函数*/

{ linklist head,L;

datatype x,y;

head=creatlinklist(); /*创建单链表*/

print(head); /*输出原单链表*/

printf("\n请输入要删除的数据区间:\n");

scanf("%d%d",&x,&y);

deletedata(head,x,y);

print(head); /*输出删除后的单链表*/

}

3.9设计一个算法,在双链表中值为y的结点前面插入一个值为x的新结点。即使值为x的新结点成为值为y的结点的前驱结点。

【答】:

首先定义双链表的数据结构,相关文件dlink.h,内容如下:

typedef int datatype; /*预定义的数据类型*/

typedef struct dlink_node{ /*双链表结点定义*/

datatype data;

struct dlink_node *llink,*rlink;

}dnode;

typedef dnode* dlinklist; /*双链表结点指针类型定义*/

/*尾插法创建带头结点的双链表*/

dlinklist creatdlinklist(void)

{ dlinklist head,r,s;

datatype x;

head=r=(dlinklist) malloc(sizeof(dnode)); /*建立双链表的头结点*/

head->llink=head->rlink=NULL;

printf("\n请输入双链表的内容:(整数序列,以0结束)\n");

scanf("%d",&x);

while (x) /*输入结点值信息,以0结束*/

{ s=(dlinklist ) malloc(sizeof(dnode));

s->data=x;

数据结构C语言版期末考试试题(有答案)

“数据结构”期末考试试题 一、单选题(每小题2分,共12分) 1.在一个单链表HL中,若要向表头插入一个由指针p指向的结点,则执行( )。 A. HL=ps p一>next=HL B. p一>next=HL;HL=p3 C. p一>next=Hl;p=HL; D. p一>next=HL一>next;HL一>next=p; 2.n个顶点的强连通图中至少含有( )。 A.n—l条有向边 B.n条有向边 C.n(n—1)/2条有向边 D.n(n一1)条有向边 3.从一棵二叉搜索树中查找一个元素时,其时间复杂度大致为( )。 A.O(1) B.O(n) C.O(1Ogzn) D.O(n2) 4.由权值分别为3,8,6,2,5的叶子结点生成一棵哈夫曼树,它的带权路径长度为( )。 A.24 B.48 C. 72 D. 53 5.当一个作为实际传递的对象占用的存储空间较大并可能需要修改时,应最好把它说明为( )参数,以节省参数值的传输时间和存储参数的空间。 A.整形 B.引用型 C.指针型 D.常值引用型· 6.向一个长度为n的顺序表中插人一个新元素的平均时间复杂度为( )。 A.O(n) B.O(1) C.O(n2) D.O(10g2n) 二、填空题(每空1分,共28分) 1.数据的存储结构被分为——、——、——和——四种。 2.在广义表的存储结构中,单元素结点与表元素结点有一个域对应不同,各自分别为——域和——域。 3.——中缀表达式 3十x*(2.4/5—6)所对应的后缀表达式为————。 4.在一棵高度为h的3叉树中,最多含有——结点。 5.假定一棵二叉树的结点数为18,则它的最小深度为——,最大深度为——· 6.在一棵二叉搜索树中,每个分支结点的左子树上所有结点的值一定——该结点的值,右子树上所有结点的值一定——该结点的值。 7.当向一个小根堆插入一个具有最小值的元素时,该元素需要逐层——调整,直到被调整到——位置为止。 8.表示图的三种存储结构为——、——和———。 9.对用邻接矩阵表示的具有n个顶点和e条边的图进行任一种遍历时,其时间复杂度为——,对用邻接表表示的图进行任一种遍历时,其时间复杂度为——。 10.从有序表(12,18,30,43,56,78,82,95)中依次二分查找43和56元素时,其查找长度分别为——和——· 11.假定对长度n=144的线性表进行索引顺序查找,并假定每个子表的长度均

经典数据结构面试题(含答案)

栈和队列的共同特点是__________________________ .栈通常采用的两种存储结构是______________________ .用链表表示线性表的优点是_______________________ 8.在单链表中,增加头结点的目的是___________________ 9.循环链表的主要优点是________________________- 12.线性表的顺序存储结构和线性表的链式存储结构分别是 __________________________ 13.树是结点的集合,它的根结点数目是_____________________ 14.在深度为5的满二叉树中,叶子结点的个数为_______________ 15.具有3个结点的二叉树有(_____________________ 16.设一棵二叉树中有3个叶子结点,有8个度为1的结点,则该二叉树中总的结点数为____________________ 17.已知二叉树后序遍历序列是dabec,中序遍历序列是debac,它的前序遍历序列是 ____________________________ 18.已知一棵二叉树前序遍历和中序遍历分别为ABDEGCFH和DBGEACHF,则该二叉树的后序遍历为______________________ 19.若某二叉树的前序遍历访问顺序是abdgcefh,中序遍历访问顺序是dgbaechf,则其后序遍历的结点访问顺序是_______________________ 20.数据库保护分为:安全性控制、完整性控制、并发性控制和数据的恢复。 在计算机中,算法是指_______________________ 算法一般都可以用哪几种控制结构组合而成_____________________ .算法的时间复杂度是指______________________ 5. 算法的空间复杂度是指__________________________ 6. 算法分析的目的是__________________________

数据结构c语言版试题大全含答案

1 绪论沈阳理工大学应用技术学院信息与控制学院 计算机科学与技术教研室 2011-5-8

数据结构复习题:绪论 单选题 1、在数据结构中,与所使用的计算机无关的数据叫_____结构。 A存储|B物理|C逻辑|D物理和存储 2、在数据结构中,从逻辑上可以把数据结构分成______。 A动态结构和静态结构|B紧凑结构和非紧凑结构|C线性结构和非线性结构|D内部结构和外部结构图 3、数据结构在计算机内存中的表示是指_______。 数据的存储结构|数据结构|数据的逻辑结构|数据元素之间的关系 4、在数据结构中,与所使用的计算机无关的是数据的______结构。 逻辑|存储|逻辑和存储|物理 5、在以下的叙述中,正确的是_____。 线性表的线性存储结构优于链表存储结构|二维数组是其数据元素为线性表的线性表|栈的操作方式是先进先出|队列的操作方式是先进后出 6、在决定选取何种存储结构时,一般不考虑_______。 各结点的值如何|结束个数的多少|对数据有哪些运算|所用编程语言实现这种结构是否方便 7、在存储数据时,通常不仅要存储各数据元素的值,而且还要存储_______。 数据的处理方法|数据元素的类型|数据元素之间的关系|数据的存储方法 8、下面说法错误的是_______。 (1)算法原地工作的含义是指不需要任何额外的辅助空间 (2)在相同的规模n下,复杂度O(n)的算法在时间上总是优于复杂度O(2n)的算法 (3)所谓时间复杂度是指最坏情况下,估计算法执行时间的一个上界 (4)同一个算法,实现语句的级别越高,执行效率越低 (1)|(1)、(2)|(1)、(4)|(3) 9、通常要求同一逻辑结构中的所有数据元素具有相同的特性。这意味着______。 数据元素具有同一特点|不仅数据元素所包含的数据项的个数要相同,而且对应的数据项的类型要一致|每个数据元素都一样|数据元素所包含的数据项的个数要相等 10、以下说法正确的是_______。 数据元素是数据的最小单位|数据项是数据的基本单位|数据结构是带结构的数据项的集合|一些表面上很不相同的数据可以有相同的逻辑结构 11、____是数据的最小单元,_____是数据的基本单位. 数据项|数据元素|信息项|表元素 12、数据结构是指_____以及它们之间的_____. (1)数据元素(2)结构|(1)计算方法(2)关系|(1)逻辑存储(2)运算|(1)数据映像(2)算法 13、计算机所处理的数据一般具备某种内在的关系,这是的指_____. 数据和数据之间存在的某种关系|元素和元素之间存在某种关系|元素内部具有某种结构|数据项和数据项之间存在某种关系 14、数据的逻辑结构可以分为_____两类. 动态结构和表态结构|紧凑结构和非紧凑结构|线性结构和非线性结构|内部结构和外部结构 15、数据的逻辑结构是指_____关系的整体. 数据元素之间逻辑|数据项之间逻辑|数据类型之间|存储结构之间 16、在存储数据时,通常不仅要存储各数据元素的值,而且还要存储_____. 数据的处理方法|数据元素的类型|数据元素之间的关系|数据的存储方法

数据结构模拟卷(含答案)经典习题培训讲学

数据结构模拟卷(含答案)经典习题

练习题 一、单项选择题 1. 若将数据结构形式定义为二元组(K,R),其中K是数据元素的有限集合,则R是K上( ) A. 操作的有限集合 B. 映象的有限集合 C. 类型的有限集合 D. 关系的有限集合 2. 在长度为n的顺序表中删除第i个元素(1≤i≤n)时,元素移动的次数为( ) A. n-i+1 B. i C. i+1 D. n-i 3. 若不带头结点的单链表的指针为head,则该链表为空的判定条件是( ) A. head==NULL B. head->next==NULL C. head!=NULL D. head->next==head 4. 引起循环队列队头位置发生变化的操作是( ) A. 出队 B. 入队 C. 取队头元素 D. 取队尾元素 5. 若进栈序列为1,2,3,4,5,6,且进栈和出栈可以穿插进行,则不.可能出现的出栈序列是( ) A. 2,4,3,1,5,6 B. 3,2,4,1,6,5 C. 4,3,2,1,5,6 D. 2,3,5,1,6,4

6. 字符串通常采用的两种存储方式是( ) A. 散列存储和索引存储 B. 索引存储和链式存储 C. 顺序存储和链式存储 D. 散列存储和顺序存储 7. 数据结构是() A.一种数据类型 B.数据的存储结构 C.一组性质相同的数据元素的集合 D.相互之间存在一种或多种特定关系的数据元素的集合 8. 算法分析的目的是() A.辨别数据结构的合理性 B.评价算法的效率 C.研究算法中输入与输出的关系 D.鉴别算法的可读性 9. 在线性表的下列运算中,不.改变数据元素之间结构关系的运算是 () A.插入B.删除 C.排序D.定位10. 下列图示的顺序存储结构表示的二叉树是( )

数据结构复习题集答案(c语言版严蔚敏)

人生难得几回搏,此时不搏更待何时? 第1章绪论 1.1 简述下列术语:数据 数据元素、数据对象、数据结构、存储结构、数据类型和抽象数据类型 解:数据是对客观事物的符号表示 在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称 数据元素是数据的基本单位 在计算机程序常作为一个整体进行考虑和处理 数据对象是性质相同的数据元素的集合 是数据的一个子集 数据结构是相互之间存在一种或多种特定关系的数据元素的集合 存储结构是数据结构在计算机中的表示 数据类型是一个值的集合和定义在这个值集上的一组操作的总称 抽象数据类型是指一个数学模型以及定义在该模型上的一组操作 是对一般数据类型的扩展 1.2 试描述数据结构和抽象数据类型的概念与程序设计语言中数据类型概念的区别 解:抽象数据类型包含一般数据类型的概念 但含义比一般数据类型更广、更抽象 一般数据类型由具体语言系统部定义 直接提供给编程者定义用户数据 因此称它们为预定义数据类型 抽象数据类型通常由编程者定义 包括定义它所使用的数据和在这些数据上所进行的操作 在定义抽象数据类型中的数据部分和操作部分时 要求只定义到数据的逻辑结构和操作说明 不考虑数据的存储结构和操作的具体实现 这样抽象层次更高 更能为其他用户提供良好的使用接口 1.3 设有数据结构(D R) 其中

试按图论中图的画法惯例画出其逻辑结构图 解: 1.4 试仿照三元组的抽象数据类型分别写出抽象数据类型复数和有理数的定义(有理数是其分子、分母均为自然数且分母不为零的分数) 解: ADT Complex{ 数据对象:D={r i|r i为实数} 数据关系:R={} 基本操作: InitComplex(&C re im) 操作结果:构造一个复数C 其实部和虚部分别为re和im DestroyCmoplex(&C) 操作结果:销毁复数C Get(C k &e) 操作结果:用e返回复数C的第k元的值 Put(&C k e) 操作结果:改变复数C的第k元的值为e IsAscending(C) 操作结果:如果复数C的两个元素按升序排列 则返回1 否则返回0 IsDescending(C) 操作结果:如果复数C的两个元素按降序排列 则返回1 否则返回0 Max(C &e) 操作结果:用e返回复数C的两个元素中值较大的一个 Min(C &e) 操作结果:用e返回复数C的两个元素中值较小的一个

数据结构(c语言版)期末考试复习试题

《数据结构与算法》(c语言版)期末考复习题 一、选择题。 1.在数据结构中,从逻辑上可以把数据结构分为 C 。 A.动态结构和静态结构B.紧凑结构和非紧凑结构 C.线性结构和非线性结构D.内部结构和外部结构 2.数据结构在计算机内存中的表示是指 A 。 A.数据的存储结构B.数据结构C.数据的逻辑结构D.数据元素之间的关系 3.在数据结构中,与所使用的计算机无关的是数据的 A 结构。 A.逻辑B.存储C.逻辑和存储D.物理 4.在存储数据时,通常不仅要存储各数据元素的值,而且还要存储 C 。A.数据的处理方法B.数据元素的类型 C.数据元素之间的关系D.数据的存储方法 5.在决定选取何种存储结构时,一般不考虑 A 。 A.各结点的值如何B.结点个数的多少 C.对数据有哪些运算D.所用的编程语言实现这种结构是否方便。 6.以下说法正确的是 D 。 A.数据项是数据的基本单位

B.数据元素是数据的最小单位 C.数据结构是带结构的数据项的集合 D.一些表面上很不相同的数据可以有相同的逻辑结构 7.算法分析的目的是 C ,算法分析的两个主要方面是 A 。(1)A.找出数据结构的合理性B.研究算法中的输入和输出的关系C.分析算法的效率以求改进C.分析算法的易读性和文档性(2)A.空间复杂度和时间复杂度B.正确性和简明性 C.可读性和文档性D.数据复杂性和程序复杂性 8.下面程序段的时间复杂度是O(n2) 。 s =0; for( I =0; i

数据结构c语言版期末考试复习试题

《数据结构与算法》复习题 一、选择题。 1在数据结构中,从逻辑上可以把数据结构分为 C 。 A ?动态结构和静态结构B.紧凑结构和非紧凑结构 C.线性结构和非线性结构 D.内部结构和外部结构 2?数据结构在计算机内存中的表示是指_A_。 A .数据的存储结构B.数据结构 C .数据的逻辑结构 D .数据元素之间的关系 3.在数据结构中,与所使用的计算机无关的是数据的A结构。 A .逻辑 B .存储C.逻辑和存储 D .物理 4.在存储数据时,通常不仅要存储各数据元素的值,而且还要存储_C A .数据的处理方法 B .数据元素的类型 C.数据元素之间的关系 D .数据的存储方法 5.在决定选取何种存储结构时,一般不考虑A A .各结点的值如何C.对数据有哪些运算 B .结点个数的多少 D .所用的编程语言实现这种结构是否方 6.以下说法正确的是D A .数据项是数据的基本单位 B .数据元素是数据的最小单位 C.数据结构是带结构的数据项的集合 D .一些表面上很不相同的数据可以有相同的逻辑结构 7.算法分析的目的是 C ,算法分析的两个主要方面是 A 。 (1) A .找出数据结构的合理性B.研究算法中的输入和输出的关系 C .分析算法的效率以求改进C.分析算法的易读性和文档性 (2) A .空间复杂度和时间复杂度B.正确性和简明性 &下面程序段的时间复杂度是0( n2) s =0; for( I =0; i

数据结构模拟卷(含答案)经典习题

练习题 一、单项选择题 1. 若将数据结构形式定义为二元组(K,R),其中K是数据元素的有限集合,则R是K上( ) A. 操作的有限集合 B. 映象的有限集合 C. 类型的有限集合 D. 关系的有限集合 2. 在长度为n的顺序表中删除第i个元素(1≤i≤n)时,元素移动的次数为( ) A. n-i+1 B. i C. i+1 D. n-i 3. 若不带头结点的单链表的指针为head,则该链表为空的判定条件是( ) A. head==NULL B. head->next==NULL C. head!=NULL D. head->next==head 4. 引起循环队列队头位置发生变化的操作是( ) A. 出队 B. 入队 C. 取队头元素 D. 取队尾元素 5. 若进栈序列为1,2,3,4,5,6,且进栈和出栈可以穿插进行,则不.可能出现的出栈序列是( ) A. 2,4,3,1,5,6 B. 3,2,4,1,6,5 C. 4,3,2,1,5,6 D. 2,3,5,1,6,4 1

6. 字符串通常采用的两种存储方式是( ) A. 散列存储和索引存储 B. 索引存储和链式存储 C. 顺序存储和链式存储 D. 散列存储和顺序存储 7. 数据结构是() A.一种数据类型 B.数据的存储结构 C.一组性质相同的数据元素的集合 D.相互之间存在一种或多种特定关系的数据元素的集合 8. 算法分析的目的是() A.辨别数据结构的合理性 B.评价算法的效率 C.研究算法中输入与输出的关系 D.鉴别算法的可读性 9. 在线性表的下列运算中,不.改变数据元素之间结构关系的运算是 () A.插入B.删除 C.排序D.定位 10. 下列图示的顺序存储结构表示的二叉树是( ) 2

数据结构(C语言版)复习题概论

一、单项选择题: 1、树形结构不具备这样的特点:() A. 每个节点可能有多个后继(子节点) B. 每个节点可能有多个前驱(父节点) C. 可能有多个内节点(非终端结点) D. 可能有多个叶子节点(终端节点) 2、二叉树与度数为2的树相同之处包括()。 A. 每个节点都有1个或2个子节点 B. 至少有一个根节点 C. 至少有一个度数为2的节点 D. 每个节点至多只有一个父节点 3、一棵完全二叉树有999 个结点,它的深度为()。 A.9 B.10 C.11 D.12 4、在一个单链表中,若p所指结点不是最后结点,在p之后插入s所指结点,则执行() A. s->next=p;p->next=s; B. s->next=p->next;p->next=s; C. s->next=p->next;p=s; D. p->next=s;s->next=p; 5、对于一棵具有n个结点、度为5的树来说,() A. 树的高度至多是n-3 B. 树的高度至多是n-4 C. 树的高度至多是n D. 树的高度至多是n-5 6、在顺序队列中,元素的排列顺序()。 A. 由元素插入队列的先后顺序决定 B. 与元素值的大小有关 C. 与队首指针和队尾指针的取值有关 D. 与数组大小有关 7、串是一种特殊的线性表,其特殊性体现在()。 A.可以顺序存储 B.数据元素是一个字符 C.可以链式存储 D.数据元素可以是多个字符若 8、顺序循环队列中(数组的大小为 6),队头指示 front 和队尾指示 rear 的值分别为 3 和 0,当从队列中删除1个元素,再插入2 个元素后,front和 rear的值分别为()。 A.5 和1 B.2和4 C.1和5 D.4 和2 9、一棵完全二叉树上有1001 个结点,其中叶子结点的个数为()。 A.250 B.500 C.254 D.501 10、已知一个有向图如下图所示,则从顶点a出发进行深度优先遍历,不可能得到的DFS序 列为()。 A.adbefc B.adcefb C.adcebf D.adefbc

经典数据结构上机题_答案解析

数据结构上机实验题目 实验一线性表的顺序存储结构 实验学时 2学时 背景知识:顺序表的插入、删除及应用。 目的要求: 1.掌握顺序存储结构的特点。 2.掌握顺序存储结构的常见算法。 实验容 1.输入一组整型元素序列,建立顺序表。 2.实现该顺序表的遍历。 3.在该顺序表中进行顺序查找某一元素,查找成功返回1,否则返回0。4.判断该顺序表中元素是否对称,对称返回1,否则返回0。 5.实现把该表中所有奇数排在偶数之前,即表的前面为奇数,后面为偶数。 6.输入整型元素序列利用有序表插入算法建立一个有序表。 7.利用算法6建立两个非递减有序表并把它们合并成一个非递减有序表。 8. 利用该顺序结构实现循环队列的入队、出队操作。 8.编写一个主函数,调试上述算法。 #include #include

#define OVERFLOW 0 #define MAXSIZE 100 typedef int ElemType; typedef struct list {ElemType elem[MAXSIZE]; int length; }Sqlist; void Creatlist(Sqlist &L) {int i; printf("请输入顺序表的长度:"); //输入一组整型元素序列,建立一个顺序表。 scanf("%d",&L.length); for(i=0;i

数据结构(C语言版)期末复习

数据结构(C语言版)期末复习汇总 第一章绪论 数据结构:是一门研究非数值计算程序设计中的操作对象,以及这些对象之间的关系和操作的学科。 数据结构分为:逻辑结构、物理结构、操作三部分 逻辑结构:集合、线性结构、树形结构、图(网)状结构 物理结构(存储结构):顺序存储结构、链式存储结构 算法:是为了解决某类问题而规定的一个有限长的操作序列。 算法五个特性:有穷性、确定性、可行性、输入、输出 评价算法优劣的基本标准(4个):正确性、可读性、健壮性、高效性及低存储量 语句频度的计算。 算法的时间复杂度: 常见有:O(1),O(n),O(n2),O(log2n),O(nlog2n),O(2n) 第二章线性表 线性表的定义和特点: 线性表:由n(n≥0)个数据特性相同的元素构成的有限序列。线性表中元素个数n(n≥0)定义为线性表的长度,n=0时称为空表。 非空线性表或线性结构,其特点: (1)存在唯一的一个被称作“第一个”的数据元素; (2)存在唯一的一个被称作“最有一个”的数据元素; (3)除第一个之外,结构中的每个数据元素均只有一个前驱; (4)除最后一个之外,结构中的每个数据元素均只有一个后继。 顺序表的插入:共计n个元素,在第i位插入,应移动(n-i+1)位元素。 顺序表的删除:共计n个元素,删除第i位,应移动(n-i)位元素。 线性表的两种存储方式:顺序存储、链式存储。 顺序存储 概念:以一组连续的存储空间存放线性表; 优点:逻辑相邻,物理相邻;可随机存取任一元素;存储空间使用紧凑; 缺点:插入、删除操作需要移动大量的元素;预先分配空间需按最大空间分配,利用不充分;表容量难以扩充; 操作:查找、插入、删除等 查找: ListSearch(SqlList L,ElemType x,int n) { int i; for (i=0;i

数据结构经典题目c语言代码

《数据结构》课程设计题目 (程序实现采用C语言) 题目1:猴子选王(学时:3) 一堆猴子都有编号,编号是1,2,3 ...m,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。 要求:m及n要求从键盘输入,存储方式采用向量及链表两种方式实现该问题求解。 //链表 #include #include // 链表节点 typedef struct _RingNode { int pos; struct _RingNode *next; }RingNode, *RingNodePtr; // 创建约瑟夫环,pHead:链表头指针,count:链表元素个数 void CreateRing(RingNodePtr pHead, int count) { RingNodePtr pCurr = NULL, pPrev = NULL; int i = 1; pPrev = pHead; while(--count > 0)

{ pCurr = (RingNodePtr)malloc(sizeof(RingNode)); i++; pCurr->pos = i; pPrev->next = pCurr; pPrev = pCurr; } pCurr->next = pHead; // 构成环状链表 } void KickFromRing(RingNodePtr pHead, int n) { RingNodePtr pCurr, pPrev; int i = 1; // 计数 pCurr = pPrev = pHead; while(pCurr != NULL) { if (i == n) { // 踢出环 printf("\n%d", pCurr->pos); // 显示出圈循序 pPrev->next = pCurr->next; free(pCurr); pCurr = pPrev->next; i = 1; } pPrev = pCurr;

数据结构C语言版(第2版)严蔚敏人民邮电出版社课后习题答案

数据结构(C语言版)(第2版) 课后习题答案 李冬梅 2015.3

目录 第1章绪论 (1) 第2章线性表 (5) 第3章栈和队列 (13) 第4章串、数组和广义表 (26) 第5章树和二叉树 (33) 第6章图 (43) 第7章查找 (54) 第8章排序 (65)

第1章绪论 1.简述下列概念:数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构、抽象数据类型。 答案: 数据:是客观事物的符号表示,指所有能输入到计算机中并被计算机程序处理的符号的总称。如数学计算中用到的整数和实数,文本编辑所用到的字符串,多媒体程序处理的图形、图像、声音、动画等通过特殊编码定义后的数据。 数据元素:是数据的基本单位,在计算机中通常作为一个整体进行考虑和处理。在有些情况下,数据元素也称为元素、结点、记录等。数据元素用于完整地描述一个对象,如一个学生记录,树中棋盘的一个格局(状态)、图中的一个顶点等。 数据项:是组成数据元素的、有独立含义的、不可分割的最小单位。例如,学生基本信息表中的学号、姓名、性别等都是数据项。 数据对象:是性质相同的数据元素的集合,是数据的一个子集。例如:整数数据对象是集合N={0,±1,±2,…},字母字符数据对象是集合C={‘A’,‘B’,…,‘Z’,‘a’,‘b’,…,‘z’},学生基本信息表也可是一个数据对象。 数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。换句话说,数据结构是带“结构”的数据元素的集合,“结构”就是指数据元素之间存在的关系。 逻辑结构:从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。因此,数据的逻辑结构可以看作是从具体问题抽象出来的数学模型。 存储结构:数据对象在计算机中的存储表示,也称为物理结构。 抽象数据类型:由用户定义的,表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称。具体包括三部分:数据对象、数据对象上关系的集合和对数据对象的基本操作的集合。 2.试举一个数据结构的例子,叙述其逻辑结构和存储结构两方面的含义和相互关系。 答案: 例如有一张学生基本信息表,包括学生的学号、姓名、性别、籍贯、专业等。每个学生基本信息记录对应一个数据元素,学生记录按顺序号排列,形成了学生基本信息记录的线性序列。对于整个表来说,只有一个开始结点(它的前面无记录)和一个终端结点(它的后面无记录),其他的结点则各有一个也只有一个直接前趋和直接后继。学生记录之间的这种关系就确定了学生表的逻辑结构,即线性结构。 这些学生记录在计算机中的存储表示就是存储结构。如果用连续的存储单元(如用数组表示)来存放这些记录,则称为顺序存储结构;如果存储单元不连续,而是随机存放各个记录,然后用指针进行链接,则称为链式存储结构。 即相同的逻辑结构,可以对应不同的存储结构。 3.简述逻辑结构的四种基本关系并画出它们的关系图。

数据结构经典例题

数据结构经典例题 1.设计一个算法将L拆分成两个带头节点的单链表L1和L2。 void split(LinkList *&L,LinkList *&L1,LinkList *&L2) { LinkList *p=L->next,*q,*r1; //p指向第1个数据节点 L1=L; //L1利用原来L的头节点 r1=L1; //r1始终指向L1的尾节点 L2=(LinkList *)malloc(sizeof(LinkList));//创建L2的头节点 L2->next=NULL; //置L2的指针域为NULL while (p!=NULL) { r1->next=p; //采用尾插法将*p(data值为ai)插入L1中 r1=p; p=p->next; //p移向下一个节点(data值为bi) q=p->next; //由于头插法修改p的next域,故用q保存*p的后继节点 p->next=L2->next; //采用头插法将*p插入L2中 L2->next=p; p=q; //p重新指向ai+1的节点 } r1->next=NULL; //尾节点next置空 } 2.查找链表中倒数第k个位置上的节点(k为正整数)。若查找成功,算法输出该节点的data域的值,并返回1;否则,只返回0。 typedef struct LNode {int data; struct LNode *link; } *LinkList; int Searchk(LinkList list,int k) { LinkList p,q; int count=0; p=q=list->link; while (p!=NULL) { if (countlink; p=p->link; } if (count

数据结构(c语言版)课后习题答案完整版

第1章绪论 5.选择题:CCBDCA 6.试分析下面各程序段的时间复杂度。 (1)O(1) (2)O(m*n) (3)O(n2) (4)O(log3n) (5)因为x++共执行了n-1+n-2+……+1= n(n-1)/2,所以执行时间为O(n2) (6)O(n) 第2章线性表 1.选择题 babadbcabdcddac 2.算法设计题 (6)设计一个算法,通过一趟遍历在单链表中确定值最大的结点。 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; (7)设计一个算法,通过遍历一趟,将链表中所有结点的链接方向逆转,仍利用原表的存储空间。 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; }

} (10)已知长度为n的线性表A采用顺序存储结构,请写一时间复杂度为O(n)、空间复杂度为O(1)的算法,该算法删除线性表中所有值为item的数据元素。 [题目分析] 在顺序存储的线性表上删除元素,通常要涉及到一系列元素的移动(删第i个元素,第i+1至第n个元素要依次前移)。本题要求删除线性表中所有值为item的数据元素,并未要求元素间的相对位置不变。因此可以考虑设头尾两个指针(i=1,j=n),从两端向中间移动,凡遇到值item的数据元素时,直接将右端元素左移至值为item的数据元素位置。 void Delete(ElemType A[ ],int n) ∥A是有n个元素的一维数组,本算法删除A中所有值为item的元素。 {i=1;j=n;∥设置数组低、高端指针(下标)。 while(i

数据结构(第4版)习题及实验参考答案数据结构复习资料完整版(c语言版)

数据结构基础及深入及考试 复习资料 习题及实验参考答案见附录 结论 1、数据的逻辑结构是指数据元素之间的逻辑关系。即从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。 2、数据的物理结构亦称存储结构,是数据的逻辑结构在计算机存储器内的表示(或映像)。它依赖于计算机。存储结构可分为4大类:顺序、链式、索引、散列 3、抽象数据类型:由用户定义,用以表示应用问题的数据模型。它由基本的数据类型构成,并包括一组相关的服务(或称操作)。它与数据类型实质上是一个概念,但其特征是使用与实现分离,实行封装和信息隐蔽(独立于计算机)。 4、算法:是对特定问题求解步骤的一种描述,它是指令的有限序列,是一系列输入转换为输出的计算步骤。 5、在数据结构中,从逻辑上可以把数据结构分成( C ) A、动态结构和表态结构 B、紧凑结构和非紧凑结构 C、线性结构和非线性结构 D、内部结构和外部结构 6、算法的时间复杂度取决于( A ) A、问题的规模 B、待处理数据的初态 C、问题的规模和待处理数据的初态 线性表 1、线性表的存储结构包括顺序存储结构和链式存储结构两种。 2、表长为n的顺序存储的线性表,当在任何位置上插入或删除一个元素的概率相等时,插入一个元素所需移动元素的平均次数为( E ),删除一个元素需要移动的元素的个数为( A )。 A、(n-1)/2 B、n C、n+1 D、n-1 E、n/2 F、(n+1)/2 G、(n-2)/2 3、“线性表的逻辑顺序与存储顺序总是一致的。”这个结论是( B ) A、正确的 B、错误的 C、不一定,与具体的结构有关 4、线性表采用链式存储结构时,要求内存中可用存储单元的地址( D ) A、必须是连续的 B、部分地址必须是连续的C一定是不连续的D连续或不连续都可以 5、带头结点的单链表为空的判定条件是( B ) A、head==NULL B、head->next==NULL C、head->next=head D、head!=NULL 6、不带头结点的单链表head为空的判定条件是( A ) A、head==NULL B、head->next==NULL C、head->next=head D、head!=NULL 7、非空的循环单链表head的尾结点P满足( C ) A、p->next==NULL B、p==NULL C、p->next==head D、p==head 8、在一个具有n个结点的有序单链表中插入一个新结点并仍然有序的时间复杂度是( B ) A、O(1) B、O(n) C、O(n2) D、O(nlog2n) 9、在一个单链表中,若删除p所指结点的后继结点,则执行( A )

数据结构典型例题

基本概念典型例题 一、单项选择题 [例6-1]数据结构用集合的观点可以表示为一个二元组DS=(D,R)。其中,D是( ①)的有穷集合,R是D上( ②)的有限集合。 ①A.算法B. 数据元素C. 数据操作D. 逻辑结构 ②A. 操作B. 映像C. 存储D.关系 解析:由数据结构的集合形式化定义可知,本题答案为:①B;②D。 [例6-2]数据的常用存储结构中不包括( )。 A.顺序存储结构B.线性结构C.索引存储结构D.散列存储结构 解析:数据通常有四种基本的存储方法,即顺序存储方法、链式存储方法、索引存储 方法和散列存储方法。由此可知,本题答案为:B。 [例6-3] 算法指的是( ①),它必须具备( ②)这三个特性。 ①A.计算方法B.排序方法C.解决问题的步骤序列D.调度方法 ②A.可执行性、可移植性、可扩充性B.可执行性、确定性、有穷性 C.确定性、有穷性、稳定性D.易读性、稳定性、安全性 解析:算法是对特定问题求解步骤的一种描述,是由若于条指令组成的有限序列。它 必须满足以下性质:输人性、输出性、有穷性、确定性、无二义性和可行性。由此可知,本 题答案为:①㈠②B。 [例6-4] 在下面的程序段中,对x的赋值语句的执行频度为( )。 for(i=0;i

数据结构经典算法试题

1.假设有两个按元素值递增次序排列的线性表,均以单链表形式存储。请编写算法将这两个单链表归并为一个按元素值递减次序排列的单链表,并要求利用原来两个单链表的结点存放归并后的单链表。【北京大学1998 三、1 (5分)】 LinkedList Union(LinkedList la,lb) { pa=la->next; pb=lb->next; la->next=null; while(pa!=null && pb!=null) ∥当两链表均不为空时作 if(pa->data<=pb->data) { r=pa->next; pa->next=la->next; ∥将pa结点链于结果表中,同时逆置。 la->next=pa; pa=r; } else {r=pb->next; pb->next=la->next; ∥将pb结点链于结果表中,同时逆置。 la->next=pb; pb=r; } while(pa!=null) ∥将la表的剩余部分链入结果表,并逆置。 {r=pa->next; pa->next=la->next; la->next=pa; pa=r; } while(pb!=null) {r=pb->next; pb->next=la->next; la->next=pb; pb=r; } }

1)设有两个无头结点的单链表,头指针分别为ha,hb,链中有数据域data,链域next,两链表的数据都按递增序存放,现要求将hb表归到ha表中,且归并后ha仍递增序,归并中ha表中已有的数据若hb中也有,则hb中的数据不归并到ha中,hb的链表在算法中不允许破坏。【南京理工大学1997 四、3(15分)】 LinkedList Union(LinkedList ha, hb)∥ha和hb是两个无头结点的数据域值递增有序的单链 {LinkedList 表,本算法将hb中并不出现在ha中的数据合并到ha中,合并中不能破坏hb链表。 la; la=(LinkedList)malloc(sizeof(LNode)); la->next=ha; pa=ha; pb=hb; pre=la; while(pa&&pb) if(pa->datadata)∥处理ha中数据 {pre->next=pa;pre=pa;pa=pa->next;} else if(pa->data>pb->data)∥处理hb中数据。 {r=(LinkedList)malloc(sizeof(LNode)); r->data=pb->data; pre->next=r; pre=r; pb=pb->next;} Else∥处理pa- >data=pb->data; {pre->next=pa; pre=pa; pa=pa->next;∥两结点数据相等时,只将ha的数据链入。 pb=pb->next; } if(pa!=null)pre->next=pa;∥将两链表中剩余部分链入结果链表。 else pre->next=pb; free(la); }

严蔚敏《数据结构(c语言版)习题集》答案第四章串

《一定能摸到红球吗?》说课稿 林银花 一、教材说明: 1、课题:《一定能摸到红球吗?》 2、本节内容的地位和作用 在现代社会中,人们面临着更多的机会和选择,常常需要在不确定情境中作出合理的决策,概率正是通过对不确定现象和事件发生的可能性的刻画,来为人们更好的制定决策提供依据和建议.本节内容又是义务教育阶段,唯一培养学生从不确定的角度来观察世界的数学内容,让学生了解可能性是普遍的,有助于他们理解社会,适应生活. 3、教学目标设计: (1)认知目标: (A)经历猜测.实验.收集与分析试验结果等过程 (B)体会事件的发生的不确定性知道事情发生的可能性有多大。 (2)、能力目标: (A)经历游戏等的活动过程,初步认识确定事件和不确定事件 (B)在与其它人交流的过程中,能合理清晰地表达自己的思维过程; (3)、情感目标: (A)通过创设游戏情境,让学生主动参与,做“数学实验”,激发学生学习的热情和兴趣,激活学生思维。 (B)在与他人的合作过程中,增强互相帮助、团结协作的精神。 (C)体会到在生活中我们可以从确定和不确定两方面分析一件事情. 4、本课重点、难点分析: 学习的重点是初步体验事情发生的确定性和不确定性. 学习的难点是确定事件发生的可能性大小. 学习本节知识应注意猜测,试验,收集与分析实验结果,从中体会事件发生的可能性及大小. 二、教学对象分析: 1、初一学生性格开朗活泼,对新鲜事物特别敏感,且较易接受,因此,教学过程中创设的问题情境应较生动活泼,直观形象,且贴近学生的生活,从而引起学生的有意注意。 2、初一学生的概括能力较弱,推理能力还有待不断发展,所以在教学时,可让学生充分试验,收集,分析,帮助他们直观形象地感知。 3、初一学生已经具备了一定的学习能力,所以本节课中,应多为学生创造自主学习、

相关文档
最新文档