当前位置:文档之家› 数据结构 习题

数据结构 习题

(2) void ex32(SeqStack *s,int c)
{
SeqStack T;
int d;
while(!StackEmpty(S))
{ d=pop(S);
if(d!=c) push(T,d);
}
while(!StackEmpty(T))
{ d=pop(T);
if(d!=c) push(S,d);
5、_在单链表第一个结点之前增设的一个类型相同的结点_______;__表结点中的第一个结点______。
6、p->next->next=head。
7、__向前移动__
四、算法阅读题
1、阅读下面的算法
LinkList mynote(LinkListL)
{//L是不带头结点的单链表的头指针
if(L&&L->next){
#define m maxlen
typedef struct{
int rear;
int data[m];
}CirQueue;
int Fibonacci(int i) //求序列的前n项算法
{ if(i == 0)
return 0;
else if(i= = 1)
return 1;
else return (Fibonacci(i-2) +Fibonacci(i-1));
(1)查询表的尾节点
(2)将第一个节点链接到表的尾部成为新的尾节点
(3)(a2,a3,….an,a1)
2、以下函数中,h是带头结点的双向循环链表的头指针。
(1)说明程序的功能;
(2)当链表中结点数分别为1和6(不包括头结点)时,请写出程序中while循环体的执行次数。
int f(DListNode *h)
LinkList * p, * q, * s;
p=head;
do{
q= p->next;
if(p->data = = q->data)
{s=q; free(s);q= q->next; }
else
p=q;
}while(p->next != head);
}
2、线性表逆置
void Convers(LinkList *head)
(1) void ex31(SeqStack *S)
{
int A[80],i,n;
n=0;
while(!empty(S))
{ A[n]=pop[S];
n++;
}
for(i=0;i<n;i++)
push(S,A[i]);
}
答案:此算法功能是通过一个数组将一个栈中的所有元素逆置存放。例如原来栈S中存放5个元素abcde,经过算法执行后,变为edcba。
D、在链表中,每个结点只有一个链域
7.带头结点head的单链表为空的判断条件是( )
A. head=NUILB、head->next=NUIL
C. head->next=head D. head!=NUIL
8.线性表通常采用两种存储结构是( )
A、顺序存储结构和链式存储结构
B.散列方式和索引方式
C.链表存储结构和数组
4、在如图所示的链表中,若在指针p所指的结点之后插入数据域值相继为a和b的两个结点,则可用下列两个语句实现该操作,它们依次是_ ______和_______。
5、.通常单链表的头结点指的是_ _______;单链表的首结点指的是________。
6、在一个带头结点的单循环链表中,p指向尾结点的直接前驱,则指向头结点的指针head可用p表示为。
return1;
}
①(i+1)%2(或1-i)
②Q->rear[i]
③(Q->rear[i]+1)%Maxsize
4、假定在一个链队列中只设置队列为指针,不设置对首指针,并且让队尾节点的指针域指向队首节点(称此微循环队列),试分别写出在循环链队上进行插入和删除操作的算法。
插入算法:
void QInsert(LNode * &Rear , const Elemtype & item)
2、所谓数据的逻辑结构指的是数据元素之间的逻辑关系。(√)
3、在线性结构中,每个结点都有一个直接前驱和一个直接后继。(╳)
三、填空题
1、在单链表中设置头结点的作用_。
2、.设head为带有头结点的单链表的头指针,则判断单链表为空的条件是:_________。
3、.带头结点的循环链表L为空表的条件是____。带头结点的双循环链表L为空表的条件是_。
int EnQueue (Queue2 *Q,int i,DateType x)
{//若第 i个队列不满,则元素x入队列,并返回1;否则返回0
if(i<0||i>1)return 0;
if(Q->rear[i]==Q->front[①]return 0;
Q->data[②]=x;
Q->rear[i]=[③];
(7,10,10,21,30,42,42,42,51,70)
经算法操作后变为
(7,10,21,30,42,51,70)
参考答案:
typedef struct node {
int data;
struct node * next;
}LinkList;
Delete_Eq(LinkList * head)
{
A.p=p->next;B、p->next=p->next->next;
C.p->next=p;D.p=p->next->next;
12.在头指针为head且表长大于1的单循环链表中,指针p指向表中某个结点,若p->next->next=head,则()
A.p指向头结点B.p指向尾结点
C.*p的直接后继是头结点D、*P的直接后继是尾
}
void Fibonacci( CirQueue * Q, int k)
{
inti, n;
Q->rear = 0;
scanf(“%d”,&n);
for(i=0; i<n ; i++)
{ Q->rear =i;
if ( i> =k) Q->rear = Q->rear% k;
Q->data [Q->rear] = Fibonacci(i);
7、从顺序表中删除一个元素时,表中所有在被删元素之后的元素均需____________一个位置。
1、简化插入删除算法.
2、head->next= =NULL_____。
3、L->next=L___。L->next=L->prior=L
4、__s->next->next=p->next______和_p->next=s_______。
D. 串中所含字符的个数
2、如下陈述中正确的式( )。
A、串是一种特殊的线性表 B、串的长度必须大于0
C、串中元素只能是字母 D、空串就是空白串
3、设字符串s1=”abcdefg”,s2=”pqrst”,则运算s=strcat(substr(s1,2,length(s2)),substr(s1,length(s2),2))后串值为( )。
{
LinkList * p, *q, *r;
p = head;
q = p->next;
p->next = NULL;
while ( q!= NULL)
{
r=q->next;
q->next=p;
p=q;
q=r;
}
head = p;
}
栈和队列习题
1.简述下面所给算法的功能是什么?(假设栈元素为整数类型)
if( p = = Rear)
Rear =NULL;
else
Rear ->next = p->next;
ElemType temp = p->data;
free(p);
return temp;
}
第四章 串习题
练习:
1、串长度的定义是( )
A.串中不同字母的个数 B.串中不同字符的个数
C.串中所含字符的个数,且大于0
13.为了最快地对线性结构的数据进行某数据元素的读取操作,则其数据存储结构宜采用( )方式。
A、顺序存储B.链式存储
C.索引存储D.散列存储
答案:1-5 BDACB 6-10 DBABC 11-13 BDA
二、判断题(判断下列各小题,正确的在题后括号内打“√”,错的打“╳”。)
1、单链表中的头结点就是单链表的第一个结点。(╳)
}
}
3.算法阅读
假设两个队列共享一个循环向量空间(参见右下图),
其类型Queue2定义如下:
typedef struct{
DateType data[MaxSize];
int front[2],rear[2];
}Queue2;
对于i=0或1,front[i]和rear[i]分别为第i个队列的头指针和尾指针。请对以下算法填空,实现第i个队列的入队操作。
A.顺序表B.用头指针表示的单循环链表
C、用尾指针表示的单循环链表D.单链表
5.在需要经常查找结点的前驱与后继的场合中,使用( )比较合适。
A.单链表B、双链表C.顺序表D.循环链表
6.下面关于线性表的叙述中,错误的为( )
A.顺序表使用一维数组实现的线性表
B.顺序表必须占用一片连续的存储单元
C.顺序表的空间利用率高于链表
相关主题