2023年6月22日发(作者:)
- - -
《数据结构》程序填空复习题
说明:本文档中涉及到的算法并非本书的全部,有些可根据此处的情况自行看书和作业题,黑色为综合练习上的题目,红色为我另增加的题,这些空的选择是根据我个人的经验来决定的并不能完全代表中央电大的出卷老师,因此一定不能有肯定就考这些题目的想法。不能放弃其他容的复习,切记!!!
一、线性表
1.设线性表为(6,10,16,4),以下程序用说明结构变量的方法建立单向链表,并输出链表中各结点中的数据。
#define NULL 0
void main( )
{NODE a,b,c,d,*head,*p;
=6;
=10;
=16;
=4; /*d是尾结点*/
head= (1) ;
=&b;
=&c;
=&d;
(2) ; /*以上结束建表过程*/
p=head; /*p为工作指针,准备输出链表*/
do
{printf(“%dn”, (3) );
(4) ;
- .可修编 . - - -
}while( (5) );
}
答案:
(1)&a
(2)dnext=NULL
(3)p->data
(4)p=p->next
(5)p!=NULL
2. 以下函数在head为头指针的具有头结点的单向链表中删除第i个结点,
struct node
{ int data;
struct node *next;
};
typedefstruct node NODE
int delete(NODE *head,int i)
{
NODE *p,*q;
int j;
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 (2)q=q->next (3)q->next (4)q->next (5)p 3.将新元素插入到线性表中的第i位,MAX是数组的个数,a[0]用以存放线性表长度,b存放待插入的元素值,i存放插入的位置,n存放线性表长度 - .可修编 . - - - { int a[MAX]; int i,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) ; (4) ; for(j=1;j<=a[0];j++) printf(“%5dn”,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; int i p=(NODE *)malloc(sizeof(NODE)); (1) ; (2) ; (3) ; for(i=1;i<=n;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->next=NULL (5)p->next=q->next (6)q->next=p 一、 栈 1. 以下函数为链栈的进栈操作,x是要进栈的结点的数据域,top为栈顶指针 struct node { ElemType data; struct node *next; }; struct node *top ; void Push(ElemType x) { struct node *p; p=(struct node*)malloc(___(1)_____); p->data=x; ___(2)_____; } 答案: (1)sizeof (struct node) (2)p->next=top (3)top=p 二、 队列 1. 以下函数为链队列的入队操作,x为要入队的结点的数据域的值,front、rear分别是链队列的队头、队尾指针 struct node { ElemType data; struct node *next; }; struct node *front,*rear; void InQueue(ElemType x) { struct node *p; p= (struct node*) ___(1)_____; p->data=x; p->next=NULL; ___(2)_____; - .可修编 . - - - rear= ___(3)_____; } 答案: (1)malloc(sizeof (struct node)) (2)rear->next=p (3)p 2. 以下函数为链队列的出队操作(链队列带有头结点),出队结点的数据域的值由x返回,front、rear分别是链队列的队头、队尾指针 struct node { ElemType data; struct node *next; }; struct node *front,*rear; ElemType OutQueue() { ElemType x; if(___(1)_____) { printf("队列下溢错误!n"); exit(1); } else { struct node *p=front->next; x=p->data; front->next= ___(2)_____; if(p->next==NULL) rear=front; free(p); ___(3)_____; } } 答案: (1)front= =rear (2)p->next (3)return(x) 三、 树 1.以下程序是先序遍历二叉树的递归算法的程序,完成程序中空格部分(树结构中左、右指针域分别为left和right,数据域data为字符型,BT指向根结点)。 void Preorder (struct BTreeNode *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指向根结点)。 void Inorder (struct BTreeNode *BT) { if(BT!=NULL){ (1) ; (2) ; (3) ; } } 答案: (1)Inorder(BT->left) (2)printf(“%c”,BT->data) (3)Inorder(BT->right) 3 以下程序是后序遍历二叉树的递归算法的程序,完成程序中空格部分(树结构中左、右指针域分别为left和right,数据域data为字符型,BT指向根结点)。 void Postorder (struct BTreeNode *BT) { if(BT!=NULL){ (1) ; (2) ; (3) ; } } 答案: (1)Postorder(BT->left) (2)Postorder(BT->right) (3)printf(“%c”,BT->data); 四、 五、 图 排序 1.以下冒泡法程序对存放在a[1],a[2],……,a[n]中的序列进行排序,完成程序中的空格- .可修编 . - - - 部分,其中n是元素个数,要求按升序排列。 void bsort (NODE a[ ], int n) { NODE temp; int i,j,flag; for(j=1; (1) ;j++); {flag=0; for(i=1; (2) ;i++) if(a[i].key>a[i+1].key) {flag=1; temp=a[i]; (3) ; (4) ; } if(flag= =0)break; } } 程序中flag的功能是(5) 答案: (1)j<=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]中的记录进行直接选择排序,完成程序中的空格 typedef struct { int key; …… }NODE; void selsort(NODE a[],int n) { int i,j,k; NODE temp; for(i=1;i<= ___(1)_____;i++) { k=i; for(j=i+1;j<= ___(2)_____;j++) if(a[j].key 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.直接插入排序算法 Void disort(NODE a[],int n) { int I,j; NODE temp;
评论列表(0条)