使用链表错误c

时间:2016-11-20 10:43:34

标签: c linked-list

我的项目是读取.txt文件,其中包含学生的姓名,我必须输入他们的分数(最多5个输入)和名称应该是链接列表,如我的附件图片所示。

data structure of names and scores

我遇到的一个问题是,当我尝试输入第三个学生的分数数据时,程序会崩溃,我认为这是一个内存溢出的问题,但我不知道如何删除任何部分以释放内存,因为所有链表都用于指向彼此。

如果有人能告诉我可能出现什么问题,我将不胜感激。抱歉我的英语很差,非常感谢你。

我的代码和txt文件如下。

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

struct nodeName {
    char *name;
    struct nodeName *linkToName;
    struct nodeScore *linkToScore;
};

struct nodeScore {
    int score;
    struct nodeScore *linkNextScore;
};

struct nodeName *insertName(struct nodeName *ptr, char *nameIn);
struct nodeName *insertScore(struct nodeName *ptr);
void displayList(struct nodeName *ptr);

struct nodeName *insertName(struct nodeName *ptr, char *nameIn) {
    struct nodeName *n = (struct nodeName *)malloc(sizeof(struct nodeName));
    int counter = 0;
    int scoreTemp;
    char checkInt;
    char *tag;
    struct nodeScore *tempS;

    tag = nameIn;
    n->name = tag;

    while (counter < 5) {
        struct nodeScore *s = (struct nodeScore *)malloc(sizeof(struct nodeScore));
        counter++;
        printf("Enter %d Score of %s:", counter, tag);
        if (scanf("%d%c", &scoreTemp, &checkInt) != 2 || checkInt == 'n') {
            printf("\nEnd saving %s's score.\n", tag);
            break;
        }
        s->score = scoreTemp;
        if (n->linkToScore == NULL)  //for the first link to node of score.
            n->linkToScore = s;
        else
            tempS->linkNextScore = s;
        s->linkNextScore = NULL;
        tempS = s;
    }
    ptr = n;
    return ptr;
}

int main() {
    FILE *nameF = fopen("HW5_26.txt", "r");
    char input[512];
    char *SingleName;
    struct nodeName *p1, *temp;
    int testN1 = 0;

    while (fgets(input, 512, nameF)) {  //get file line by line
        SingleName = strtok(input, " "); //if 'space' or 'New line', save as a single name.
        printf("\n");
        printf("Name# %d = %s\n", ++testN1, SingleName);
        printf("\n");

        p1 = insertName(p1, SingleName);
        temp = p1;

        while (SingleName != NULL) {
            SingleName = strtok(NULL, " ");  //put n name into SingleName
            if (SingleName != NULL) {
                printf("___________________________\n\n");
                printf("Name# %d = %s\n", ++testN1, SingleName);
                printf("\n");
                p1 = insertName(p1, SingleName);
                temp->linkToName = p1;
                temp = p1;
            }
        }
    }
    return 0;
}

HW5_26.txt

的内容
Albert Steve David Mike
Andrew Joanne Chris Fred
Dennis Leo Fred Frances
Dave Hua Sarah

1 个答案:

答案 0 :(得分:1)

您的代码中存在重大设计问题:

  • 您应该允许多个名称:Albert Einstein是2个字。名称文件每行应包含一个全名。使用fgets()阅读并使用str[strcspn(str, "\n")] = '\0';

  • 删除尾随换行符
  • 您应该将所有标记作为一行阅读,并使用strtol()进行解析。如果未移动strtol()更新的指针,则表示您已阅读所有标记。

  • 您插入名称的代码不会将该节点附加到Student列表。

  • 函数insertName()应该复制带有strdup()或等效字符串的字符串。编码后,所有节点的名称都指向main函数中同一缓冲区的某些部分,每次调用都会覆盖fgets()

  • 您声明了insertScore函数但不使用它。为清晰起见,最好将代码移到单独的函数中。

  • 您应该检查fopenmalloc的返回值,以便优雅地处理错误。

  • 您可以使用typedef删除struct个关键字,并使代码更易于阅读。