struct employee { long num; float salary; struct employee*next; }; int n; struet employee*del(struet

admin2013-12-19  34

问题 struct employee
    {
    long num;
    float salary;
    struct employee*next;
    };
    int n;
    struet employee*del(struet employee*head.10ng num)
    {
    struct employee*p1,*p2;
    if(head==NULL)
    {
    printf(“list null!\n”);
    }
    pl=head;
    while((1))
    {
    p2=p1;
    p1=p1->next;
    }
    if((2))
    {
    if(p1==head)
    head=pl->next;
    else
    (3)
    (4)
    p1=NULL;
    printf(“del hum%ld\n”,num);
    (5)
    }
    else
    printf(“cannot find hum!\n”);
    return head;
    }

选项

答案(1)nurn!=p1->num&&p1->next!=NULL (2)num==p1->num (3)p2->next=p1->next (4)free(p1) (5)n=n-1

解析 本程序主要定义了一个职员信息的结构体employee和一个用于删除链表的方法del(),此外还定义了一个全局变量n,用于保存链表中的结点个数。
    由第一个while循环中的后移结点操作语句p2=p1;p1=p1->next;可知,当前循环未找到需要删除的结点,因此while的循环条件为num!=p1->num&&p1->next!=NULL,即第一个空格的内容。
    当找到要删除的结点时,该结点有两种情况,一是该结点为第一个结点,二是该结点为第一个结点之外的其他结点。因此第二个空格应填入num==p1->num,判断找到的结点是否为需要删除的结点。
    当删除的结点为第一个结点(p1==head)时,head=p1->next;,将头指针指向第一个结点的后一个结点,也就是第二个结点,这样第一个结点就不在链表中了,即删除了第一个结点。
    当删除的结点不是第一个结点时,应将原来指向当前结点的指针指向它的下一个结点,然后释放当前结点,完成删除,因此,第三、第四个空格分别填入p2->next=p1->next和free(p1)。
    删除结点后,表的结点数减1,因此第五个空格应填入n=n-1。
转载请注明原文地址:https://kaotiyun.com/show/YSal777K
0

最新回复(0)