B087

01-程序填空题 田少松, 软件154 226浏览

所属年份:2012.3;

给定程序中,函数fun的功能是将带头结点的单向链表结点数据域中的数据从小到大排序。即若原链表结点数据域从头至尾的数据为:10、4、2、8、6,排序后链表结点数据域从头至尾的数据为:2、4、6、8、10。
请在程序的下画线处填入正确的内容并把下画线删除,使程序得出正确的结果。

注意:部分源程序在文件BLANK1.C中。
不得增行或删行,也不得更改程序的结构!

#include  <stdio.h>
#include  <stdlib.h>
#define    N    6
typedef struct node
{
    int  data;
    struct node  *next;
} NODE;

void fun(NODE  *h)
{
    NODE  *p, *q;
    int  t;
    /**********found**********/
    p = __1__ ;
    while (p)
    {
        /**********found**********/
        q = __2__ ;
        while (q)
        {
            /**********found**********/
            if (p->data __3__ q->data)
            {
                t = p->data;
                p->data = q->data;
                q->data = t;
            }
            q = q->next;
        }
        p = p->next;
    }
}

NODE *creatlist(int  a[])
{
    NODE  *h,*p,*q;
    int  i;
    h = (NODE *)malloc(sizeof(NODE));
    h->next = NULL;
    for(i=0; i<N; i++)
    {
        q=(NODE *)malloc(sizeof(NODE));
        q->data=a[i];
        q->next = NULL;
        if (h->next == NULL)  h->next = p = q;
        else
        {
            p->next = q;
            p = q;
        }
    }
    return  h;
}

void outlist(NODE  *h)
{
    NODE  *p;
    p = h->next;
    if (p==NULL)  printf("The list is NULL!\n");
    else
    {
        printf("\nHead  ");
        do
        {
            printf("->%d", p->data);
            p=p->next;
        }
        while(p!=NULL);
        printf("->End\n");
    }
}

main()
{
    NODE  *head;
    int  a[N]= {0, 10, 4, 2, 8, 6 };
    head=creatlist(a);
    printf("\nThe original list:\n");
    outlist(head);
    fun(head);
    printf("\nThe list after sorting :\n");
    outlist(head);
}

【参考答案】

(1)h->next  
(2)p->next  
(3)>

【解题思路】
填空1:本题考查了指针变量p赋初值,使p指向链表的头结点的下一个结点,因此本空应该填写h->next。
填空2:本空考查了q的作用,q代表p的下一个数,因此次空应该填写p->next。
填空3:if判断句是比较链表中相邻两个数的大小,如果p->data>q->data就交换这两个数的值,因而此空填写>。