gpt4 book ai didi

C-将子链表传递给函数

转载 作者:行者123 更新时间:2023-11-30 14:57:05 26 4
gpt4 key购买 nike

我正在使用这个简单的列表程序,但我在传递指针时遇到了麻烦。

假设我有一个学生结构

typedef struct student{
char lastname[50];
int age;
int std_id;
struct student * next;
struct student * prev;
}stdn;

我还有另一个类结构

typedef struct class{
char class_id[3];
struct class * next;
struct class * prev;
struct student * stdn_list;
}clss;

所以基本上我有这个包含类(class)的列表,每个类(class)都包含一个包含学生的子列表。

所以,这是创建类列表的函数,它可以工作!

void create_class_list(clss ** root, clss * node){
clss * root_aux;
if(!(*root)){
(*root) = node;
}
else{
root_aux = (*root);
while(root_aux->next != NULL){
root_aux = root_aux->next;
}
node->prev = root_aux;
root_aux->next = node;
}
}

我的问题是当我需要使用类列表的每个节点中的子列表时。

这是负责创建子列表的函数,它可以工作

    void assign_student(clss ** root, stdn * node, char * class_id){
clss * root_aux;
stdn * stdn_aux;
root_aux = (*root);

while(root_aux != NULL){
if(strcmp(root_aux->class_id,class_id) == 0)
break;
root_aux = root_aux->next;
}
if(root_aux != NULL){
if(root_aux->stdn_list == NULL){
root_aux->stdn_list = node;
}
else{
stdn_aux = root_aux->stdn_list;
while(stdn_aux->next != NULL){
stdn_aux = stdn_aux->next;
}
node->prev = stdn_aux;
stdn_aux->next = node;
}
}
}

基本上,这个函数会查找特定的类(class)并将学生添加到该类(class)。

我的问题是,当我想要删除学生或使用冒泡排序等算法对列表进行排序时,下面是删除学生的函数示例。

void delete_student(clss ** root, int stdn_id){
clss * root_aux;
stdn * stdn_aux;
stdn * temp;
int deleted=0;

root_aux = (*root);
while(root_aux != NULL){
stdn_aux = root_aux->stdn_list;
//try with root first//
if(stdn_aux->std_id == stdn_id){
temp = stdn_aux;
stdn_aux = stdn_aux->next;
stdn_aux->prev = NULL;
free(temp);
deleted = 1;
}
//if the student isn't the root
if(deleted == 0){
stdn_aux = stdn_aux->next;
while(stdn_aux != NULL){
if(stdn_aux->std_id == stdn_id){
temp = stdn_aux;
//link the prev element with the next element
stdn_aux->prev->next = stdn_aux->next;
//link the next element with the prev element
stdn_aux->next->prev = stdn_aux->prev;
stdn_aux = stdn_aux->next;
free(temp);
deleted = 1;
break;
}
stdn_aux = stdn_aux->next;
}
}
if(deleted == 1){
break;
}
root_aux = root_aux->next;
}
}

该函数看起来就像不从列表中删除元素,我不确定是否与我将指针传递给函数的方式有关,或者与我如何首先创建列表有关。

最佳答案

当您删除位于学生列表头部的学生节点时,您需要重新分配给root_aux->stdn_list,因为您正在删除它当前指向的节点。这一定是您没有删除学生节点的原因。

root_aux->stdn_list = stdn_aux->next; 

还有一些与处理有关的问题应该包含在 if 语句中以防止程序核心转储:

在开始处理学生列表之前,您需要首先检查是否存在学生列表。也就是说,检查指向学生列表的类变量 - root_aux->stdn_list - 是否不为 NULL。

在执行以下语句之前,请确保 stdn_aux->next 不为 NULL,即您要删除的根节点之外还有内容。

stdn_aux = stdn_aux->next;
stdn_aux->prev = NULL;

在进行此作业之前

stdn_aux->next->prev = stdn_aux->prev;

检查 stdn_aux->next 是否不为 null,因为这是学生列表中的最后一个节点。

关于C-将子链表传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44148055/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com