《数据结构》程序填空复习题Word文档格式.docx
- 文档编号:21098543
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:18
- 大小:19.68KB
《数据结构》程序填空复习题Word文档格式.docx
《《数据结构》程序填空复习题Word文档格式.docx》由会员分享,可在线阅读,更多相关《《数据结构》程序填空复习题Word文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
structnode*next;
};
typedefstructnodeNODE
intdelete(NODE*head,inti)
{
NODE*p,*q;
intj;
q=head;
j=0;
while((q!
=NULL)&
&
(___
(1)_____))
___
(2)_____;
j++;
if(q==NULL)
return(0);
p=___(3)_____;
___(4)_____=p->
next;
free(___(5)_____);
return
(1);
(1)j<
i-1
(2)q=q->
(3)q->
(4)q->
(5)p
3.将新元素插入到线性表中的第i位,MAX是数组的个数,a[0]用以存放线性表长度,b存放待插入的元素值,i存放插入的位置,n存放线性表长度
inta[MAX];
inti,j,b,n;
scanf(“%d%d%d”,&
b,&
i,&
n);
for(j=1;
j<
=n;
j++)
scanf(“%d”,&
a[j]);
a[0]=n;
for(j=n;
(1);
j--)
(2);
(3);
=a[0];
printf(“%5d\n”,a[j]);
(1)j>
=i
(2)a[j+1]=a[j]
(3)a[i]=b
(4)a[0]=n+1
4.用头插法建立带头结点且有n个结点的单向链表的算法
NODE*create(n)
NODE*head,*p,*q;
inti
p=(NODE*)malloc(sizeof(NODE));
(1);
(3);
for(i=1;
i<
i++)
{
p=(NODE*)malloc(sizeof(NODE));
p->
data=i;
if(i==1)
(4);
else
{
(5);
(6);
}
}
return(head);
(1)head=p
(2)p->
next=NULL
(3)q=p
(4)p->
(5)p->
next=q->
(6)q->
next=p
一、栈
1.以下函数为链栈的进栈操作,x是要进栈的结点的数据域,top为栈顶指针
structnode
{ElemTypedata;
structnode*top;
voidPush(ElemTypex)
{
structnode*p;
p=(structnode*)malloc(___
(1)_____);
p->
data=x;
___
(2)_____;
(1)sizeof(structnode)
next=top
(3)top=p
二、队列
1.以下函数为链队列的入队操作,x为要入队的结点的数据域的值,front、rear分别是链队列的队头、队尾指针
structnode*front,*rear;
voidInQueue(ElemTypex)
structnode*p;
p=(structnode*)___
(1)_____;
p->
next=NULL;
rear=___(3)_____;
(1)malloc(sizeof(structnode))
(2)rear->
(3)p
2.以下函数为链队列的出队操作(链队列带有头结点),出队结点的数据域的值由x返回,front、rear分别是链队列的队头、队尾指针
ElemTypeOutQueue()
ElemTypex;
if(___
(1)_____){
printf("
队列下溢错误!
\n"
);
exit
(1);
else{
structnode*p=front->
x=p->
data;
front->
next=___
(2)_____;
if(p->
next==NULL)rear=front;
free(p);
___(3)_____;
}
(1)front==rear
(3)return(x)
三、树
1.以下程序是先序遍历二叉树的递归算法的程序,完成程序中空格部分(树结构中左、右指针域分别为left和right,数据域data为字符型,BT指向根结点)。
voidPreorder(structBTreeNode*BT)
{if(BT!
=NULL){
(1);
(2);
(3);
(1)printf(“%c”,BT->
data)
(2)Preorder(BT->
left)
(3)Preorder(BT->
right)
2.以下程序是中序遍历二叉树的递归算法的程序,完成程序中空格部分(树结构中左、右指针域分别为left和right,数据域data为字符型,BT指向根结点)。
voidInorder(structBTreeNode*BT)
(1)Inorder(BT->
(2)printf(“%c”,BT->
(3)Inorder(BT->
3以下程序是后序遍历二叉树的递归算法的程序,完成程序中空格部分(树结构中左、右指针域分别为left和right,数据域data为字符型,BT指向根结点)。
voidPostorder(structBTreeNode*BT)
(1)Postorder(BT->
(2)Postorder(BT->
(3)printf(“%c”,BT->
data);
四、图
五、排序
1.以下冒泡法程序对存放在a[1],a[2],……,a[n]中的序列进行排序,完成程序中的空格部分,其中n是元素个数,要求按升序排列。
voidbsort(NODEa[],intn)
{NODEtemp;
inti,j,flag;
for(j=1;
j++);
{flag=0;
if(a[i].key>
a[i+1].key)
{flag=1;
temp=a[i];
(4);
if(flag==0)break;
}
程序中flag的功能是(5)
=n-1
(2)i<
=n-j
(3)a[i]=a[i+1]
(4)a[i+1]=temp
(5)当某趟冒泡中没有出现交换则已排好序,结束循环
2.以下函数为直接选择排序算法,对a[1],a[2],…a[n]中的记录进行直接选择排序,完成程序中的空格
typedefstruct
{intkey;
……
}NODE;
voidselsort(NODEa[],intn)
inti,j,k;
NODEtemp;
=___
(1)_____;
i++)
k=i;
for(j=i+1;
=___
(2)_____;
j++)
if(a[j].key<
a[k].key)__(3)______;
if(i!
=k)
temp=a[i];
___(4)_____;
____(5)____;
(1)n-1
(2)n
(3)k=j
(4)a[i]=a[k]
(5)a[k]=temp
3.直接插入排序算法
Voiddisort(NODEa[],intn)
intI,j;
n;
temp=a[i];
(1);
while(j>
=0&
temp.key<
a[j].key)
(2);
(3);
(4);
(1)j=i-1
(3)j--
(4)a[j+1]=temp
4.快速排序
voidquicksort(NODEa[],intstart,intend)
intiI,j;
NODEmid;
if(start>
=end)
return;
mid=a[i];
while((3))
while(i<
j)&
a[j].key>
mid.key)
;
if((5);
)
(7);
j&
a[i].key<
=mid.key)
(8);
if(i<
j)
(9);
(10);
a[i]=mid;
(11);
;
(1)i=start
(2)j=end
(3)i<
j
(4)j--也可能将此条语句写出,要填写其条件中的a[j].key>
mid.key
(5)i<
(6)a[i]=a[j]
(7)i++
(8)i++也可能将此条语句写出,要填写其条件中的a[i].key<
=mid.key
(9)a[j]=a[i]
(10)j--
(11)quicksort(a,start,i-1)
(12)quicksort(a,i+1,end)
最后两句要填的概率会很高,要注意快速排序的考点很多,一般只会有三到四个空。
5.直接选择排序
voidselsort(NODEa[],intn)
=n-1;
for(j=
(2);
a[k].key)(3);
if((4))
(1)k=i
(2)i+1
(4)i!
=k
(5)temp=a[i]
(6)a[i]=a[k]
(7)a[k]=temp
前四句较为重要
6.堆排序中的筛选算法
voidheapshift(NODEa[],intI,intn)
intj;
while(j<
n)
if(j+1<
n&
a[j+1].key)
if(temp.key>
break;
(6);
(1)j=2*i
(2)j++
(3)a[i]=a[j]
(4)i=j
(5)j=2*i
(6)a[i]=temp
这是构建的小根堆,若是大根堆,只要将if语句中的a[j].key>
a[j+1].key改为<
,再将第二个if语句中的>
改为<
即可
7.堆排序
voidheapsort(NODEa[],intn)
for(i=
(1);
i>
=1;
i--)
(2);
for(i=n;
1;
temp=a[1];
(5);
(1)n/2
(2)heapshift(a,i,n)
(3)a[1]=a[i]
(4)a[i]=temp
(5)heapshift(a,1,i-1)
8.两个有序序列的归并
voidmerge(NODEa[],ints,intm,intn,NODEorder[])
inti=s,j=m+1,k=s;
while((
(1))&
(
(2)))
if(a[i].key<
=a[j].key)
if(i>
m)
while(j<
=n)
Else
While(i<
=m)
(1)i<
=m
(2)j<
=n
(3)order[k++]=a[i++]可保留此句,将其条件语句去掉
(4)order[k++]=a[j++]可保留此句,将其条件语句去掉
(5)Order[k++]=a[j++]可保留此句,将其条件语句去掉
(6)order[k++]=a[i++]可保留此句,将其条件语句去掉
第(3)(4)空与第(5)(6)空有较直接的关联,因此一般情况下若要求填(3)(4)就不会要求填(5)(6),若(5)(6)位要填也是填其条件句
七、查找
1.以下函数在a[0]到a[n-1]中,用折半查找算法查找关键字等于k的记录,查找成功返回该记录的下标,失败时返回-1,完成程序中的空格
intBinary_Search(NODEa[],intn,intk)
intlow,mid,high;
low=0;
high=n-1;
while(___
(1)_____)
mid=(low+high)/2;
if(a[mid].key==k)
return__
(2)______;
elseif(___(3)_____)
low=mid+1;
else__(4)______;
___(5)_____;
(1)low<
=high
(2)mid
(3)a[mid].key<
k;
(4)high=mid-1
(5)return-1;
此为折半查找的非递归算法
2.1.以下函数在a[0]到a[n-1]中,用折半查找的递归算法查找关键字等于k的记录,查找成功返回该记录的下标,失败时返回-1,完成程序中的空格
intBinary_Search(NODEa[],intlow,inthigh,intk)
if(low<
=high)
intmid=
(1);
if(
(2))
returnmid;
elseif((3))
elsereturn-1;
(1)mid=(low+high)/2
(2)a[mid].key==k
k
(4)return(a[],low,mid-1,k)
(5)return(a[],mid+1,high,k)
3.以下函数是二叉排序树的查找算法,若二叉树为空,则返回根结点的指针,否则,返回值是指向树结点的结构指针p(查找成功p指向查到的树结点,不成功p指向为NULL)完成程序中的空格
typedefstructBnode
structBnode*left;
structBnode*right;
}Bnode;
Bnode*BSearch(Bnode*bt,intk)
/*bt用于接收二叉排序树的根结点的指针,k用以接收要查找的关键字*/
{Bnode*p;
if(bt==___
(1)_____)
return(bt);
p=bt;
while(p->
key!
=__
(2)______)
{if(k<
key)
else___(4)_____;
if(p==NULL)break;
Return(___(5)_____);
(1)NULL
(2)k
(3)p=p->
left
right
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 程序 填空 复习题