B028 删除链表中数据域值相同的结点 ★★

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

所属年份: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;

void  fun( SLIST *h)
{
    SLIST  *p, *q;
    p=h->next;
    if (p!=NULL) {
        q=p->next;
        while(q!=NULL) {
            if (p->data==q->data) {
                p->next=q->next;
                /**********found**********/
                free(___1___);
                /**********found**********/
                q=p->___2___;
            } else {
                p=q;
                /**********found**********/
                q=q->___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]= {1,2,2,3,4,4,4,5};
    head=creatlist(a);
    printf("\nThe list before deleting :\n");
    outlist(head);
    fun(head);
    printf("\nThe list after deleting :\n");
    outlist(head);
    return 0;
}

【参考答案】

(1) q  (2) next  (3) next

【考点分析】
本题考查:释放内存空间函数free();链表结点的基本操作。

【解题思路】
填空1:使用free函数,释放q所指的内存空间,其一般格式为:free(指针变量)。
填空2和填空3:删除链表中符合条件结点后,指针要指向下一个结点。