C:将结构读入链接列表(从文件)

标签 c linked-list malloc global-variables

我是 C 编程的新手。我创建了一个学生数据库,将学生详细信息输入到链表中(以结构“phbook”的形式)并将链表保存到文本文件中。我无法开始工作的部分是将文本文件记录读取到链表中。当我关闭程序然后选择“从外部文件加载”时,程序运行但不更新链表。请有人帮我弄清楚问题是什么。在我编写“readFile”和“insertFull”函数之前,我知道一切正常。 friend 告诉我,全局变量 "struct phbook *list = NULL; 导致了问题。请让我知道。

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

struct phbook{
    int number;
    char name[20];
    int mark;
    struct part *next;
};

struct phbook *list = NULL;
struct phbook *find_student(int number);
void insertFull(struct phbook* list, int number, char Name[10],int mark);
int main(void)
{
    int code;
    int opt1;
    int courses, i, k, j, counter;
    for (;;){
        printf("Enter operation code: \n");
        printf("(1) ADD NEW STUDENT DETAILS: \n");
        printf("(2) SEARCH STUDENT DETAILS: \n");
        printf("(3) DISPLAY REPORT OF ALL STUDENTS: \n");
        printf("(4) SAVE ALL STUDENT RECORDS TO EXTERNAL FILE: \n");
        printf("(5) LOAD ALL STUDENT RECORDS FROM EXTERNAL FILE: \n");
        scanf(" %d", &code);
     switch (code){
         case 1 : insert();
                        break;
         case 2 : search();
                        break;
            break;
         case 3 : print();
            break;
         case 4 :
             saveToFile();
                        break;
                   case 5 :
             readFile();
                        break;
         default: printf("Illegal code\n");
}
 printf("\n");
}
    }


struct phbook *find_student(int number)
{
    struct phbook *p;
    for (p = list; p != NULL && number != p->number; p = p->next);//was sorted
    if (p != NULL && number == p->number)
        return p;
        return NULL;
}

void insert(void)
{
    struct phbook *cur;
    struct phbook *prev;
    struct phbook *new_node;
    new_node = (struct phbook*) malloc(sizeof(struct phbook));
    if (new_node == NULL){
        printf("db full er1.\n");
        return;
    }
    printf("enter student id");
    scanf("%d", &new_node->number);
    for (cur = list, prev = NULL; cur!= NULL && new_node->number > cur->number; prev = cur, cur = cur->next);
    printf("Enter name: ");
    scanf("%s", &new_node->name);//readline(new_node->name, NAME_LEN)
    printf("Enter MARK: ");
    scanf("%d", &new_node->mark);

    new_node->next = cur;
    if (prev == NULL)
        list = new_node;
    else
        prev->next = new_node;
}

void search(void)
{
    int number;
    struct phbook *p;
    printf("Enter ID: ");
    scanf("%d", &number);
    p = find_student(number);
    if (p != NULL){
        printf("Name: %s\n", p->name);
        printf("Marks: %d\n", p->mark);
    }
    else
    printf("student not found.\n");
}

void print(void)
{
    struct phbook *p;
    printf("Student_Number Student_Name Student_Mark\n");
    for (p = list; p != NULL; p = p->next)
        printf("%7d %-25s %d\n", p->number, p->name, p->mark);
}
void saveToFile()
{
    FILE* fp;
    fp = fopen ("results.txt","w");


   struct phbook* curr = list;//he
   while(curr!=NULL)
   {
    fprintf(fp,"%s\n", list->name);
    fprintf(fp,"%d\n",curr->number);
    fprintf(fp, "%d\n", curr->mark);
       curr = curr->next;
   }
   fclose(fp);
}

void readFile()
{
    FILE* fp;
    if (!(fp = fopen ("results.txt", "r")))
        printf("File NOT Found");
    else{
        struct phbook *curr;
        struct phbook *prev;
        char TempName[10];
        int TempNumber;
        int TempMark;
        int done = 0;
        int count = 0;
        int success;//dummy
        curr = list;//sets it to the head (first nde of ll)
        if(list == NULL);
        printf("List is null\n");

        if(curr == NULL)
            printf("List is null\n");

        while (curr!=NULL)
        {
            curr = curr->next;
        }
        while (done == 0)
        {
            success = fscanf(fp, "%s", TempName);
            if (success == 1)
                {
                    success = fscanf(fp, "%d", &TempNumber);
                    if (success == 1)
                    {
                        success = fscanf(fp, "%d", &TempMark);

                        if(success == 1)
                        {
                            insertFull(list,TempNumber,TempName,TempMark);
                        }
                    }

                }
                else
                {
                    done = 1;
                }

        }
    }
}
void insertFull(struct phbook* list, int number, char Name[10],int mark)
{
   struct phbook *cur;
    struct phbook *prev;
    struct phbook *new_node;
    new_node = (struct phbook*) malloc(sizeof(struct phbook));
    if (new_node == NULL){
        printf("db full er1.\n");
        return;
    }

    for (cur = list, prev = NULL; cur!= NULL && new_node->number > cur->number; prev = cur, cur = cur->next);
    new_node->number = number;
    new_node->mark = mark;
    strcpy(new_node->name,Name);
    new_node->next = cur;
    if (prev == NULL)
        list = new_node;
    else
        prev->next = new_node;


}

最佳答案

程序中

void insertFull(struct phbook* list, int number, char Name[10],int mark)

您正在更改列表的本地副本,这对全局电话簿列表没有影响。

您可以从参数列表中删除列表,从而更改全局变量:

   void insertFull(int number, char Name[10],int mark)

这不是严格意义上的好编程,但它符合您的其余代码。

关于C:将结构读入链接列表(从文件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36091455/

相关文章:

c - 将一个项目添加到链表会创建两个项目?

c - 链表中具有字符数组的节点的内存分配

c - 这个美元符号在 __asm 中是什么意思?

C 指针和内存分配 : Realloc Arrays and Pointer Passing

c - 在 C 中执行一个使用数学库的文件

java - 隔离链表中的偶数和奇数节点

c - 错误: assignment to expression with array type in c

c - C99 中的灵活数组

c - 读取输入(int)并使用 malloc 和 realloc 将其存储到数组中

c - malloc 与 mmap 性能