我一直在寻找一些关于如何从单链表中取消链接(不删除)节点的示例代码。我的目的是取消链接节点并存储其指针,以便以后可以将其链接回链表中的某个位置。
有谁知道我怎么能这样做?
这是我的结构:
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
希望这有助于进一步解释。
答案 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
?