RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1554875
Accepted
justSMTH
justSMTH
Asked:2023-12-06 21:15:05 +0000 UTC2023-12-06 21:15:05 +0000 UTC 2023-12-06 21:15:05 +0000 UTC

列表的单链表在 C 中不起作用

  • 772

我需要在 C 中创建一个已实现的结构的列表列表,但它不会保存任何内容。每次我尝试向列表中添加新元素时,列表都会重置。其余代码工作正常。从文件中正确读取所需的数据。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <stdio.h>
#define MAX_SIZE_OF_MATRIX 3
#define MAX_SIZE_OF_VAL 4
typedef struct STR {
    int Val;
    int Row;
    struct STR* Next;
} STR;
typedef struct ListSTR {
    STR* row;
    struct ListSTR* Next;
} ListSTR;
void Add(STR** point, int Val, int Row) {
    if (*point == NULL) {
        *point = (STR*)malloc(sizeof(STR));
        (*point)->Row =Row;
        (*point)->Val = Val;
        (*point)->Next = NULL;
        return 0;
    }
    while ((*point)->Next != NULL) {
        (*point) = (*point)->Next;
    }
    (*point)->Next = (STR*)malloc(sizeof(STR));
    (*point)->Next->Val = Val;
    (*point)->Next->Row = Row;
    (*point)->Next->Next = NULL;
}
void AddToIndex(ListSTR** matrix, int index, int Val, int Row) {
    for (int i = 0; i < index; i++) {
        if ((*matrix)->Next != NULL) {
            (*matrix) = (*matrix)->Next;
        }
        else {
            printf("Error");
            exit(1);
        }
    }
    STR* point = (*matrix)->row;
    if (point == NULL) {
        point = (STR*)malloc(sizeof(STR));
        point->Row = Row;
        point->Val = Val;
        point->Next = NULL;
        return 0;
    }
    while (point->Next != NULL) {
        point = point->Next;
    }
    point->Next = (STR*)malloc(sizeof(STR));
    point->Next->Val = Val;
    point->Next->Row = Row;
    point->Next->Next = NULL;
}
void clean(STR* point) {
    STR* start = point->Next;
    while (start != NULL) {
        STR* next = start->Next;
        free(start);
        start = next;
    }
    free(point);
}
int isNum(char c) {
    switch (c) {
    case '1':
        return 1;
    case '2':
        return 1;
    case '3':
        return 1;
    case '4':
        return 1;
    case '5':
        return 1;
    case '6':
        return 1;
    case '7':
        return 1;
    case '8':
        return 1;
    case '9':
        return 1;
    case '0':
        return 1;
    default:
        return 0;
    }
}
int isWhitespace(char c) {
    switch (c) {
    case' ':
        return 1;
    case'\n':
        return 1;
    case'\0':
        return 1;
    default:
        return 0;
    }
}
void GetRowsAndColums(char* filename, int* ROWS, int* COLUMNS) {
    FILE* fp = fopen(filename, "r");
    char rows[MAX_SIZE_OF_MATRIX];
    char c;
    while (isWhitespace(c = getc(fp))) {}
    int i = 0;
    while (1) {
        i = 0;
        if (isNum(c)) {
            rows[i] = c;
            i++;
        }
        else if (isWhitespace(c)) {
            if (c == '\n') {
                printf("Error");
                exit(1);
            }
            *ROWS = strtol(rows, NULL, 10);
            break;
        }
        else {
            printf("Error");
            exit(1);
        }
        c = getc(fp);
    }
    while (isWhitespace(c = getc(fp))) {}
    char column[MAX_SIZE_OF_MATRIX];
    i = 0;
    while (1) {
        i = 0;
        if (isNum(c)) {
            column[i] = c;
            i++;
        }
        else if (isWhitespace(c)) {
            *COLUMNS = strtol(column, NULL, 10);
            break;
        }
        else {
            printf("Error");
            exit(1);
        }
        c = getc(fp);
    }
    fclose(fp);
}
void TestAdd(ListSTR* matrix) {
    for (int i = 0; i < 3; i++) {
        matrix->row = (STR*)malloc(sizeof(STR));
        matrix->row->Row = i;
        matrix->row->Val = i + 1;
        matrix->row->Next = NULL;
        matrix = matrix->Next;
    }
}
void printMatrix(ListSTR* matrix, int ROWS, int COLUMNS) {
    STR* point;
    for (int i = 0; i < ROWS; i++) {
        point = matrix->row;
        int lastRow = 0;
        for (int j = 0; j < COLUMNS; j++) {
            if (point == NULL) {
                for (int k = 1; k <= COLUMNS - lastRow; k++) {
                    printf("0 ");
                }
                break;
            }
            int Val = point->Val;
            int Row = point->Row;
            if (Row == 0) {
                printf("%d ", Val);
            }
            else if (Row >= COLUMNS) {
                printf("Error");
                exit(1);
            }
            else if (Row - lastRow >= 1) {
                for (int k = 1; k <= Row - lastRow; k++) {
                    printf("0 ");
                }
                printf("%d ", Val);
                lastRow = Row;
            }
            else if (Row <= lastRow) {
                printf("Error");
                exit(1);
            }
            else {
                printf("%d ", Val);
            }
            point = point->Next;
        }
        printf("\n");
        matrix = matrix->Next;
    }
}
void Initialize(ListSTR* matrix, int ROWS) {
    for (int i = 0; i < ROWS; i++) {
        matrix->row = NULL;
        matrix->Next = malloc(sizeof(ListSTR));
        matrix = matrix->Next;
    }
}
void ReadMatrix(ListSTR** matrix, int ROWS, int COLUMNS, char* filename) {
    FILE* fp = fopen(filename, "r");
    char c;
    int count = 0;
    while(c=getc(fp)!='\n'){}
    while (1) {
        while (1) {
            while (isWhitespace(c = getc(fp))) {}
            int i = 0;
            char val[MAX_SIZE_OF_VAL];
            int value;
            int row;
            while (1) {
                if (c == '-' && i == 0) {
                    val[i] = c;
                    i++;
                }
                else if (isNum(c)) {
                    val[i] = c;
                    i++;
                }
                else if (isWhitespace(c)) {
                    if (c == '\n') {
                        printf("Error");
                        exit(1);
                    }
                    value = strtol(val, NULL, 10);
                    break;
                }
                else {
                    printf("Error");
                    exit(1);
                }
                c = getc(fp);
            }
            while (isWhitespace(c = getc(fp))) {}
            char rows[MAX_SIZE_OF_MATRIX];
            i = 0;
            while (1) {
                if (isNum(c)) {
                    rows[i] = c;
                    i++;
                }
                else if (isWhitespace(c)) {
                    row = strtol(rows, NULL, 10);
                    if (row >= ROWS) {
                        printf("Error");
                        exit(1);
                    }
                    break;
                }
                else if (c == EOF) {
                    row = strtol(rows, NULL, 10);
                    if (row >= ROWS) {
                        printf("Error");
                        exit(1);
                    }
                    break;
                }
                else {
                    printf("Error");
                    exit(1);
                }
                c = getc(fp);
            }
            Add((*matrix)->row, value, row);
            if (c == '\n' || c==EOF) {
                break;
            }
        }
        count++;
        if (count >= ROWS) {
            break;
        }
        (*matrix) = (*matrix)->Next;
    }
    fclose(fp);
}
int Main() {
    int ROWS, COLUMNS;
    char* file = "Text.txt";
    GetRowsAndColums(file, &ROWS, &COLUMNS);
    ListSTR* matrix = malloc(sizeof(ListSTR));
    Initialize(matrix, ROWS);
    //ListSTR* result = malloc(sizeof(ListSTR));
    //Initialize(result, COLUMNS);
    ReadMatrix(&matrix, ROWS, COLUMNS, file);
    printMatrix(matrix, ROWS, COLUMNS);
    return 0;
}

这是文本文件

3 3
1 0 7 2
-3 2
10 0 4 1
c
  • 1 1 个回答
  • 77 Views

1 个回答

  • Voted
  1. Best Answer
    avp
    2023-12-09T05:38:41Z2023-12-09T05:38:41Z

    起初我不太理解你的算法(事实上你立即创建了Initialize()整个字符串列表,并且在文件读入时不动态添加它们ReadMatrix()),所以在调试你的代码后我意识到我错了一些评论。

    我仍然不明白你在函数中到底打印了什么printMatrix(),但是通过添加我的代码(下面注释掉),我确保矩阵正在正确构建。

    从文件中读取数字时也会出现错误。读取最后一个数字后,您没有写下结束行的 nil。我通过在读取每个数字后将 nil 写入该行来纠正此问题。

    我还重写了该函数Add(),恕我直言,它变得更简单(至少现在没有代码重复)。

    我不知道你在什么操作系统中编写,但在我的(Linux)中我将其替换Main()为main().

    这就是结果发生的情况(我注释掉了我替换的行 - ////):

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    #include <locale.h>
    #include <stdio.h>
    #define MAX_SIZE_OF_MATRIX 3
    #define MAX_SIZE_OF_VAL 4
    typedef struct STR {
        int Val;
        int Row;
        struct STR* Next;
    } STR;
    typedef struct ListSTR {
        STR* row;
        struct ListSTR* Next;
    } ListSTR;
    
    
    void Add(STR** point, int Val, int Row) {
      /*
        if (*point == NULL) {
            *point = (STR*)malloc(sizeof(STR));
            (*point)->Row =Row;
            (*point)->Val = Val;
            (*point)->Next = NULL;
            return;
        }
        while ((*point)->Next != NULL) {
            (*point) = (*point)->Next;
        }
        (*point)->Next = (STR*)malloc(sizeof(STR));
        (*point)->Next->Val = Val;
        (*point)->Next->Row = Row;
        (*point)->Next->Next = NULL;
      */
      STR *t = malloc(sizeof(STR));
      t->Row = Row;
      t->Val = Val;
      t->Next = NULL;
      STR **p = point;
      if (*p)
        for (p = &(*p)->Next; *p; p = &(*p)->Next);
      *p = t;
        
    }
    
    void AddToIndex(ListSTR** matrix, int index, int Val, int Row) {
        for (int i = 0; i < index; i++) {
            if ((*matrix)->Next != NULL) {
                (*matrix) = (*matrix)->Next;
            }
            else {
                printf("Error");
                exit(1);
            }
        }
        STR* point = (*matrix)->row;
        if (point == NULL) {
            point = (STR*)malloc(sizeof(STR));
            point->Row = Row;
            point->Val = Val;
            point->Next = NULL;
        ////        return 0;
        return;
        }
        while (point->Next != NULL) {
            point = point->Next;
        }
        point->Next = (STR*)malloc(sizeof(STR));
        point->Next->Val = Val;
        point->Next->Row = Row;
        point->Next->Next = NULL;
    }
    void clean(STR* point) {
        STR* start = point->Next;
        while (start != NULL) {
            STR* next = start->Next;
            free(start);
            start = next;
        }
        free(point);
    }
    int isNum(char c) {
        switch (c) {
        case '1':
            return 1;
        case '2':
            return 1;
        case '3':
            return 1;
        case '4':
            return 1;
        case '5':
            return 1;
        case '6':
            return 1;
        case '7':
            return 1;
        case '8':
            return 1;
        case '9':
            return 1;
        case '0':
            return 1;
        default:
            return 0;
        }
    }
    int isWhitespace(char c) {
        switch (c) {
        case' ':
            return 1;
        case'\n':
            return 1;
        case'\0':
            return 1;
        default:
            return 0;
        }
    }
    void GetRowsAndColums(char* filename, int* ROWS, int* COLUMNS) {
        FILE* fp = fopen(filename, "r");
        char rows[MAX_SIZE_OF_MATRIX];
        char c;
        while (isWhitespace(c = getc(fp))) {}
        int i = 0;
        while (1) {
            i = 0;
            if (isNum(c)) {
          ////            rows[i] = c;
          ////            i++;
          rows[i++] = c; rows[i] = 0;
            }
            else if (isWhitespace(c)) {
                if (c == '\n') {
                    printf("Error");
                    exit(1);
                }
                *ROWS = strtol(rows, NULL, 10);
                break;
            }
            else {
                printf("Error");
                exit(1);
            }
            c = getc(fp);
        }
        while (isWhitespace(c = getc(fp))) {}
        char column[MAX_SIZE_OF_MATRIX];
        i = 0;
        while (1) {
            i = 0;
            if (isNum(c)) {
          ////            column[i] = c;
          ////            i++;
          column[i++] = c;  column[i] = 0;
            }
            else if (isWhitespace(c)) {
                *COLUMNS = strtol(column, NULL, 10);
                break;
            }
            else {
                printf("Error");
                exit(1);
            }
            c = getc(fp);
        }
        fclose(fp);
    }
    void TestAdd(ListSTR* matrix) {
        for (int i = 0; i < 3; i++) {
            matrix->row = (STR*)malloc(sizeof(STR));
            matrix->row->Row = i;
            matrix->row->Val = i + 1;
            matrix->row->Next = NULL;
            matrix = matrix->Next;
        }
    }
    void printMatrix(ListSTR* matrix, int ROWS, int COLUMNS) {
      /*
      for (ListSTR *mx = matrix; mx; mx = mx->Next) {
        for (STR *point = mx->row; point; point = point->Next) 
          printf("%p: %d %d  ", point, point->Val, point->Row);
        puts("");
      }
      puts("");
      */    
      
    
    
        STR* point;
        for (int i = 0; i < ROWS; i++) {
            point = matrix->row;
            int lastRow = 0;
            for (int j = 0; j < COLUMNS; j++) {
                if (point == NULL) {
                    for (int k = 1; k <= COLUMNS - lastRow; k++) {
                        printf("0 ");
                    }
                    break;
                }
                int Val = point->Val;
                int Row = point->Row;
                if (Row == 0) {
                    printf("%d ", Val);
                }
                else if (Row >= COLUMNS) {
                    printf("Error");
                    exit(1);
                }
                else if (Row - lastRow >= 1) {
                    for (int k = 1; k <= Row - lastRow; k++) {
                        printf("0 ");
                    }
                    printf("%d ", Val);
                    lastRow = Row;
                }
                else if (Row <= lastRow) {
                    printf("Error");
                    exit(1);
                }
                else {
                    printf("%d ", Val);
                }
                point = point->Next;
            }
            printf("\n");
            matrix = matrix->Next;
        }
    }
    void Initialize(ListSTR* matrix, int ROWS) {
        for (int i = 0; i < ROWS; i++) {
            matrix->row = NULL;
            matrix->Next = malloc(sizeof(ListSTR));
            matrix = matrix->Next;
        }
    }
    ////void ReadMatrix(ListSTR** matrix, int ROWS, int COLUMNS, char* filename) {
    void ReadMatrix(ListSTR *matrix, int ROWS, int COLUMNS, char* filename) {
        FILE* fp = fopen(filename, "r");
        char c;
        int count = 0;
        while(c=getc(fp)!='\n'){}
        while (1) {
            while (1) {
                while (isWhitespace(c = getc(fp))) {}
                int i = 0;
                char val[MAX_SIZE_OF_VAL];
                int value;
                int row;
                while (1) {
                    if (c == '-' && i == 0) {
              ////         val[i] = c;
              ////             i++;
              val[i++] = c; val[i] = 0;
                    }
                    else if (isNum(c)) {
              ////                    val[i] = c;
              ////                    i++;
              val[i++] = c; val[i] = 0;
                    }
                    else if (isWhitespace(c)) {
                        if (c == '\n') {
                            printf("Error");
                            exit(1);
                        }
                        value = strtol(val, NULL, 10);
                        break;
                    }
                    else {
                        printf("Error");
                        exit(1);
                    }
                    c = getc(fp);
                }
                while (isWhitespace(c = getc(fp))) {}
                char rows[MAX_SIZE_OF_MATRIX];
                i = 0;
                while (1) {
                    if (isNum(c)) {
              ////                    rows[i] = c;
              ////                    i++;
              rows[i++] = c; rows[i] = 0;
                    }
                    else if (isWhitespace(c)) {
                        row = strtol(rows, NULL, 10);
                        if (row >= ROWS) {
                            printf("Error");
                            exit(1);
                        }
                        break;
                    }
                    else if (c == EOF) {
                        row = strtol(rows, NULL, 10);
                        if (row >= ROWS) {
                            printf("Error");
                            exit(1);
                        }
                        break;
                    }
                    else {
                        printf("Error");
                        exit(1);
                    }
                    c = getc(fp);
                }
            ////            Add((*matrix)->row, value, row);
            Add(&(matrix->row), value, row);
                if (c == '\n' || c==EOF) {
                    break;
                }
            }
            count++;
            if (count >= ROWS) {
                break;
            }
        ////        (*matrix) = (*matrix)->Next;
        matrix = matrix->Next;
        }
        fclose(fp);
    }
    
    
    
    void *
    FreeMatrix (ListSTR *matrix)
    {
      ListSTR *next = 0;
      for (ListSTR *mx = matrix; mx; mx = next) {
        STR *next_p = 0;
        for (STR *point = mx->row; point; point = next_p) {
          next_p = point->Next;
          free(point);
        }
        next = mx->Next;
        free(mx);
      }
    
      return 0;
    }
    
    
    ////int Main() {
    int main() {
        int ROWS, COLUMNS;
        char* file = "Text.txt";
        GetRowsAndColums(file, &ROWS, &COLUMNS);
        ListSTR* matrix = malloc(sizeof(ListSTR));
        Initialize(matrix, ROWS);
        //ListSTR* result = malloc(sizeof(ListSTR));
        //Initialize(result, COLUMNS);
        ////    ReadMatrix(&matrix, ROWS, COLUMNS, file);
        ReadMatrix(matrix, ROWS, COLUMNS, file);
        printMatrix(matrix, ROWS, COLUMNS);
    
        matrix = FreeMatrix(matrix);
    
        return 0;
    }
    

    例如,我没有查看本示例中未调用的函数AddToIndex()(即我不知道那里的代码是否正确)。

    使用您的数据运行的示例(以及我添加的矩阵打印,因为它内置在内存中):

    avp@avp-desktop:~/avp/hashcode$ gcc tt2.c && ./a.out
    0x55893face520: 1 0  0x55893face540: 7 2  
    0x55893face560: -3 2  
    0x55893face580: 10 0  0x55893face5a0: 4 1  
    
    
    1 0 0 7 0 
    0 0 -3 0 
    10 0 4 0 0 
    avp@avp-desktop:~/avp/hashcode$ 
    

    希望这对您有帮助。

    • 1

相关问题

  • free 出于某种原因不会从内存中删除数组

  • 请帮助代码

  • 为什么 masm 对字符串或文本文字太长发誓,为什么在结构中设置 db 或 dw?

  • 如何将数字拆分为位并将其写入 C 中的数组?

  • 如何以给定的角度移动物体?

  • 解决“子集和问题”的时效算法

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5