C 如何从单链表中取消节点链接并存储未链接的节点指针?

C 如何从单链表中取消节点链接并存储未链接的节点指针?,c,linked-list,C,Linked List,我一直在寻找一些关于如何从单链接列表中取消链接(而不是删除)节点的示例代码。我的目标是取消节点链接并存储其指针,以便以后可以将其链接回链接列表中的某个位置 有人知道我是如何做到这一点的吗 这是我的结构: struct Courses{ char *courseName; int creditValue; Courses *next; };Courses; struct Student{ char *name;

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

有人知道我是如何做到这一点的吗

这是我的结构:

 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
希望这有助于进一步解释

要“取消链接”节点,只需更改指向它的节点的
下一个

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

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

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

如果你想解开中间的一个节点,那么你应该跟踪它前面的节点,这样你就可以把它们粘回到一个链表上。

< p>这里的解锁代码:

#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;
}
#包括
typedef结构课程{
char*courseName;
国际信用价值;
结构课程*下一步;
}课程;
类型定义结构学生{
字符*名称;
智力年龄;
课程*列表;//课程链接列表的第一个课程(节点)。
}学生;
课程*
取消链接(学生*学生,课程*删除)
{
课程*prev;
课程*cur;
prev=NULL;
对于(cur=student->list;cur!=NULL;prev=cur,cur=cur->next){
如果(cur==移除){
如果(上一个!=NULL)
上一步->下一步=当前->下一步;
其他的
学生->列表=当前->下一步;
cur->next=NULL;
打破
}
}
退换货;
}

请注意,您可能必须更明确地说明重新链接所需的条件。也就是说,您希望如何“找到”重新插入点等?您想按
creditValue
进行扫描,还是已经有
课程*在
之后插入?

问题不清楚。你能举几个例子吗?@aksam编辑以进一步解释。是的。[显然],它假定您有一个指向要删除的节点的指针[根据某些条件,调用者已经找到了它]。代码将从列表中的任何位置删除节点(此处为
remove
):前面、后面、中间。它不执行“按数据值搜索节点”,它假定调用者已经这样做了。这样一个一体式函数是(例如):
Courses*find\u和delink(Student*Student,char*course\u name,int credit\u value)
。这就是我在答案底部的意思。除了如何实现列表函数外,还需要考虑需要哪些/多少列表函数