B023 计算带头结点的单向链表的数据之和 ★

01-程序填空题 软件121, 唐鼎威 1004浏览

所属年份:2010.9;2011.3;2012.3;

下列给定程序中,函数fun的功能是:计算一个带头结点的单向链表中各结点的数据域中数值之和,结果作为函数值返回。

请在下画线处填入正确的内容并将下画线删除,使程序得出正确的结果。

#include    <stdio.h>
#include    <stdlib.h>
#define    N    8

typedef  struct list {
    int  data;
    struct list  *next;
} SLIST;

SLIST *creatlist(int  *);

void outlist(SLIST  *);

int fun( SLIST  *h)
{
    SLIST  *p;
    int  s=0;
    p=h->next;
    while(p) {
        /**********found**********/
        s+= p->___1___;
        /**********found**********/
        p=p->___2___;
    }
    return s;
}

int main()
{
    SLIST  *head;
    int  a[N]= {12,87,45,32,91,16,20,48};
    head=creatlist(a);
    outlist(head);
    /**********found**********/
    printf("\nsum=%d\n", fun(___3___));
    return 0;
}

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

void outlist(SLIST  *h)
{
    SLIST  *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");
    }
}

【参考答案】

(1)data  (2) next  (3) head

【考点分析】
本题考查:链表数据结构,结点的表示方法;掌握链表数据结构的基本思想。

【解题思路】

本题考查的是链表的数据结构,需利用指针变量才能实现,一个结点中应包含一个指针变量,用来存放下一个结点的地址。

建立单项链表的一般步骤是:建立头指针→建立第一个结点→头指针指向第一个结点→建立第二个结点→第一个结点的指针与指向第二个结点→……→最后一个结点的指针指向NULL。

填空1:变量s用来累加各结点的数据域,因此该空应为data。
填空2:每次循环结束时,指针P指向下一个结点,即p=p->next。
填空3:由被调用函数的形参列表可知,此处应为指针类型变量,因为要对链表的数据域求和,所以将链表的头指针传给被调用函数。