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)
。这就是我在答案底部的意思。除了如何实现列表函数外,还需要考虑需要哪些/多少列表函数