首页 > 解决方案 > 简化链表指针循环

问题描述

试图从文件中扫描数字并将它们存储为链表,但是每次扫描和存储值时,用于链接节点的临时指针 (ptr) 都会运行一个 while 循环。有没有办法在不使用while循环的情况下简化它?我的方法似乎不起作用。

原始代码:

struct node
{
    int data;
    struct node *link;
} *head = NULL, *ptr = NULL, *temp = NULL;

int main()
{
-----
-----
for (i = 0; i < n ; ++i)
    {
        temp = malloc(sizeof(struct node));
        fscanf(fptr, "%d", &(temp->data));
        temp->link = NULL;

        if (head == NULL)
            head = temp;
        
        else
        {
            ptr = head;
            while (ptr->link != NULL)
                ptr = ptr->link;
            ptr->link = temp;
        }
    }
-----
}

我的方法:

struct node
{
    int data;
    struct node *link;
} *head = NULL, *ptr = NULL, *temp = NULL;

int main()
{
-----
-----
for (i = 0; i < n ; ++i)
{
    temp = malloc(sizeof(struct node));
    fscanf(fptr, "%d", &(temp->data));
    temp->link = NULL;

    if (head == NULL)
    {
        head = temp;
        ptr = head;
    }
    
    else
    {
        ptr->link = temp;
        ptr->link = ptr->link->link;
    }
}
-----
}

标签: cpointerslinked-listsingly-linked-list

解决方案


在此代码段中

else
{
    ptr->link = temp;
    ptr->link = ptr->link->link;
}

ptr->link设置为,NULL因为实际上它设置temp->link为等于NULL由于此分配

temp->link = NULL;

你需要的是写

else
{
    ptr->link = temp;
    ptr = temp;
}

实际上,您正在尝试实现一个双边单链表,其中指针ptr扮演尾指针的角色..


推荐阅读