如何取消链接节点与单链接列表并存储未链接的节点指针?

时间:2016-02-13 20:56:11

标签: c linked-list

我一直在寻找一些关于如何从单链表中取消链接(不删除)节点的示例代码。我的目的是取消链接节点并存储其指针,以便以后可以将其链接回链表中的某个位置。

有谁知道我怎么能这样做?

这是我的结构:

 struct Courses{
        char *courseName;
        int creditValue;
        Courses *next;
    };Courses;

struct Student{
        char *name;
        int age;
        Courses *list;  //First course (node) for Courses linked list.
    }Student;

我想要做的例子:

我有以下链接列表:

1 -> 2 -> 3 -> 4 -> 5

现在我要取消链接3并将其位置存储在其他位置。

1 -> 2 -> 4 -> 5

3  (Stored somwhere)

然后最后我想把3链接到列表中的某个地方。现在可以说我想在4之后。

1 -> 2 -> 4 -> 3 -> 5

希望这有助于进一步解释。

2 个答案:

答案 0 :(得分:0)

To" unlink"节点只是更改指向它的节点的next域。

您当然可以保留未链接节点的指针,稍后再使用此节点。取消链接与释放分配给节点的内存不同。

例如,以下函数取消链接第一个节点并将其返回:

Courses * GetFirstCourse(Student * s)
{
    Courses * result = s -> list;
    if (result)
    {
        s -> list = result -> next;
    }
    return result;
}

如果要取消链接中间的节点,则应跟踪其前面的节点,以便将它们粘贴回链接列表。

答案 1 :(得分:0)

这是取消关联的代码:

#include <stdio.h>

typedef struct Courses {
    char *courseName;
    int creditValue;
    struct Courses *next;
} Courses;

typedef struct Student {
    char *name;
    int age;
    Courses *list;              // First course (node) for Courses linked list.
} Student;

Courses *
delink(Student *student,Courses *remove)
{
    Courses *prev;
    Courses *cur;

    prev = NULL;

    for (cur = student->list;  cur != NULL;  prev = cur, cur = cur->next) {
        if (cur == remove) {
            if (prev != NULL)
                prev->next = cur->next;
            else
                student->list = cur->next;
            cur->next = NULL;
            break;
        }
    }

    return remove;
}

请注意,您可能必须更清楚地了解重新链接所需的条件。也就是说,你想如何找到&#34;重新插入点等?您想要creditValue进行扫描还是已经有Courses *insert_after