【问题标题】:Linked Lists and Structures in C - Passing Linked List and Structures as Parameters in function (C)C 中的链表和结构 - 在函数 (C) 中将链表和结构作为参数传递
【发布时间】:2017-05-31 13:55:05
【问题描述】:

我有以下代码,我正在努力使其更具动态性和可重用性。 好吧,我有一个名为 Student 的结构和结构列表,其中包含所有添加的学生。我有一个函数“int addStudent(Student b,list StudentList){”,我试图将结构Student和StudentList作为参数传递。但问题是我做错了什么,我的列表不包含所有添加的学生。它只包含最后一个。 你能帮帮我吗?

注意:我必须为"int addStudent(Student b, list StudentList)" 创建一个正文。不允许更改此函数的声明 ...这对我来说非常困难,我需要建议来解决...

提前谢谢你!

#include <stdio.h>
#include <stdlib.h>

#define MAXSTRING 100
#define MAXLessonS 100

typedef  enum genders{
    female, 
    male
} genders;

typedef struct Student
{
    char name[MAXSTRING];
    char Surname[MAXSTRING];
    enum genders gender;
    int id;
    char Lessons[MAXLessonS][MAXSTRING];
} Student;


typedef struct list 
{
    struct list * next;
    struct Student * Student;
} list;

void printlist(list * StudentList) 
{
    list * current = StudentList;
    while (current != NULL) {
        printf("Student ID      = %d\n", current->Student->id);
        printf("Student name    = %s\n", current->Student->name);
        printf("Student Surname = %s\n", current->Student->Surname);
        printf("Student gender  = %d\n", current->Student->gender);
        printf("Student Lesson  = %s\n", current->Student->Lessons);     
        current = current->next;
    }
}


int main()
{
    Student b={"name 1","Surname 1",male,22,{"Lesson 1"}};  
    Student c={"name 2","Surname 2",female,32,{"Lesson 2"}};  

    list* StudentList = NULL;
    StudentList = malloc(sizeof(list));
    StudentList->next = NULL;
    //StudentList->next->next = NULL;

    int x=addStudent(b,StudentList);
    StudentList->next=NULL;
    int xx=addStudent(c,StudentList);

    printlist(StudentList);
    return 0;
}

int addStudent(Student b, list StudentList){
    //StudentList=malloc(sizeof(list));
    StudentList.Student = &b;
    //StudentList.next->next=NULL; 
    //free(StudentList);
    return 1;
}

【问题讨论】:

  • StudentList.Student = &amp;b;:用最后一个(c)覆盖指针...
  • 您的列表只包含一个节点 - 同样令人惊讶的是,您没有收到有关 addStudent 定义的警告/错误,因为它与您使用它的方式不同。
  • @Jean-François Fabre 我无法理解如何解决它......
  • @Chris Turner 我正在使用 Dev-C++ 编译器...而且我没有任何错误警告...

标签: c function struct linked-list parameter-passing


【解决方案1】:

addStudent 方法总是覆盖以前的节点。所以你的列表只包含 1 个节点。此外,要“存储”一个链表,您需要保留一个指向链表头部(第一个元素)的指针。

【讨论】:

  • 我通常不喜欢改变代码的格式,因为你可能有你自己的理由来做你做的事情。但是,将指向下一个节点的指针存储在 Student 结构中可能更有意义。然后你可以使用 list 结构来存储相对于整个列表的东西。像头/尾指针和所有插入/弹出/等方法。这样,学生将成为您列表中的各个节点。您将只有 1 个列表对象来存储整个列表。
【解决方案2】:

你有两个问题:

1) 将局部变量的地址添加到列表中

2) 你永远不会扩展列表,即它总是包含一个元素

解决问题 1) 将addStudent 函数更改为:

int addStudent(Student* b, list* StudentList){
                     ^^^     ^^^
                   Use a pointer

    StudentList->Student = b;
                         ^^^
                       Save the pointer

    return 1;
}

然后这样称呼它:

int x=addStudent(&b, StudentList);
                 ^^

解决问题2):

您需要malloc 一个新的列表项并将其插入到当前列表中。

但是,您当前的代码有点奇怪,因为您还在 main 中分配了一个 list,但没有在其中添加任何内容。相反,在addStudent 函数中只分配list 项似乎更好。

一个简单的方法是:

// This function inserts new item in the front of the list
list*  addStudent(Student* b, list* StudentList){
    list* t;
    t = malloc(sizeof(list));
    if (!t) exit(1);
    t->next = StudentList;
    t->Student = b;
    return t;
}

int main()
{
    Student b={"name 1","Surname 1",male,22,{"Lesson 1"}};  
    Student c={"name 2","Surname 2",female,32,{"Lesson 2"}};  

    list* StudentList = NULL;

    StudentList = addStudent(&b, StudentList);
    StudentList = addStudent(&c, StudentList);

    printlist(StudentList);
    return 0;
}

【讨论】:

    【解决方案3】:

    使用一段时间来使用指针转到最后一个元素,然后在列表中创建新元素 void addStudent(Student *b, list *StudentList) list *elem; elem = StudentList; while (elem->next) elem = elem->next; //now you can create your elem elem->next = malloc(sizeof(list)); elem->next->student = b; elem->next->next = NULL;

    【讨论】:

    • elem-&gt;next-&gt;student = b;Student 分配给 Student* 这是非法的
    • @elfuretto 谢谢你的帮助!但我必须为“int addStudent(Student b,list StudentList)”创建一个主体。不允许更改此函数的声明 ....
    • 不能给指针参数:int x=addStudent(b,StudentList);并使用简单的结构调用您的函数: int addStudent(Student b, list StudentList) 您可以准确更改的代码部分是什么?只有学生的身体?因为你的代码有一些问题。最后一个问题,这是一个学校项目吗?
    猜你喜欢
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多