B015 删除链表尾部结点 ★★

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

所属年份:2010.9;2011.3;2012.3;

下列给定程序中已建立了一个带头结点的单向链表,在main函数中将多次调用fun函数,每调用一次,输出链表尾部结点中的数据,并释放该结点,使链表缩短。

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

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

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

void fun( SLIST  *p)
{
    SLIST  *t, *s;
    t=p->next;
    s=p;
    while(t->next != NULL) {
        s=t;
        /**********found**********/
        t=t->___1___;
    }
    /**********found**********/
    printf(" %d ",___2___);
    s->next=NULL;
    /**********found**********/
    free(___3___);
}

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("\nThe list is NULL!\n");
    else {
        printf("\nHead");
        do {
            printf("->%d",p->data);
            p=p->next;
        } while(p!=NULL);
        printf("->End\n");
    }
}

int main()
{
    SLIST  *head;
    int  a[N]= {11,12,15,18,19,22,25,29};
    head=creatlist(a);
    printf("\nOutput from head:\n");
    outlist(head);
    printf("\nOutput from tail: \n");
    while (head->next != NULL) {
        fun(head);
        printf("\n\n");
        printf("\nOutput from head again :\n");
        outlist(head);
    }
    return 0;
}

【参考答案】

(1)next  (2) t->data  (3) t

【考点分析】
本题考查:链表数据结构,结点的表示方法,掌握链表数据结构的基本思想;释放内存空间函数free()。

【解题思路】
填空1:因为是链表操作,所以要使t逐一往后移动,语句为t=t->next。
填空2:输出链表结点的数据域,即t->data。
填空3:使用free函数将t所指向的内存空间释放。释放内存空间函数free调用形式: free(void*p);。功能:释放p所指向的一块内存空间,p是一个任意类型的指针变量,它指向被释放区域的首地址。被释放区应是由malloc或calloc函数所分配的区域。