📜  资质| GATE CS 1998 |问题5(1)

📅  最后修改于: 2023-12-03 15:28:13.682000             🧑  作者: Mango

资质 | GATE CS 1998 | 问题5

这是GATE CS 1998年的计算机科学与工程考试中的一道问题。该问题测试了考生对指针、数据结构和C语言的理解。下面是问题描述和代码片段:

问题描述
有一个链表,链表每个节点都包含一个字符型数据和一个指针,指针指向下一个节点。现有以下C函数,函数中的头结点为链表的第一个节点。在程序中将这个函数的调用和功能描述一下。

void fun(struct node *head)
{
    struct node *p1 = head, *p2 = head;
    while(p1 != NULL)
    {
        p1 = p1->next->next;
        p2 = p2->next;
    }
    printf("%c", p2->data);
}

请描述出该函数的作用和思想。

解析

该函数的作用是打印链表中间节点的数据。

该函数的思想是使用两个指针p1和p2,p1的步长为2,p2的步长为1。当p1指向链表末尾时,p2指向的节点就是中间节点。

具体实现方法是,用p1和p2同时从头节点开始往后遍历链表,当p1指向的节点为NULL时,p2指向的节点就是链表的中间节点。最后打印出该节点的数据即可。

示例

以下是该函数的调用示例:

struct node *head = createList(); // 创建一个链表
fun(head); // 打印链表中间节点的数据

如果链表中有五个节点,节点数据分别为A、B、C、D、E,则该函数会打印出C这个字符。