在VSCODE中運行代碼,第一次運行可以正確輸出結果,第二次運行雖然有結果,但是會出現報錯。
uj5u.com熱心網友回復:
你的代碼呢?貼圖內容如何能定位問題?uj5u.com熱心網友回復:
陣列越界了,下標為-1了uj5u.com熱心網友回復:
#include <malloc.h>#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEN1 sizeof(struct veg1) //令LEN代表struct student型別資料的長度
typedef struct information1 //蔬菜基本資訊
{
int num1; //排序編號
int num2; //分類碼
char nutrition[100]; //營養成分
char name[20]; //蔬菜名字
} information1;
typedef struct information2 //蔬菜種植資訊
{
int num; //分類編號
int area; //蔬菜種植面積
int weight; //蔬菜識訓重量
int year; //識訓年份
char name[20]; //蔬菜名字
} information2;
typedef struct veg1 //下屬大類kind的蔬菜型別
{
int flag; //用于標記該單元是否已經進行訪問
struct information1 info; //結構體蔬菜的資料域
struct veg1 *next;
} veg1;
typedef struct veg2 //用于蔬菜種植資訊表的結構體
{
struct information2 plant_info; //結構體蔬菜的資料域
struct veg2 *next;
} veg2;
typedef struct kind
{
int num;
char kind_name[20]; //型別名稱
struct kind *right; //并列大類
struct veg1 *down; //下屬子類
} kind;
kind *creat_trunk(); //創造大類主鏈
veg1 *sorting_line(FILE *); //添加一個排序主鏈,用于對蔬菜基本資訊表中的蔬菜進行排序和匯入大類主鏈
void insert_veg(kind *, FILE *); //往主鏈添加蔬菜
void save(veg1 *, FILE *);
char *split(char *, char *);
//主鏈的添加
kind *creat_trunk()
{
int i;
struct kind *head;
struct kind *p1, *p2;
head = (struct kind *)malloc(sizeof(kind)); //表頭空節點,可以不賦值,或者賦值一個用不到的值
p2 = head;
for (i = 1; i < 6; i++)
{
p1 = (struct kind *)malloc(sizeof(kind));
p1->num = i;
p1->right = NULL;
p1->down = NULL;
if (i == 1)
strcpy(p1->kind_name, "根莖類");
else if (i == 2)
strcpy(p1->kind_name, "果菜類");
else if (i == 3)
strcpy(p1->kind_name, "瓜類");
else if (i == 4)
strcpy(p1->kind_name, "葉菜類");
else if (i == 5)
strcpy(p1->kind_name, "菌類");
p2->right = p1;
p2 = p1;
}
p2->right = NULL;
return (head); //回傳頭指標
}
//植物的插入
void insert_veg(kind *head, FILE *fp) //creat函式 :回傳值是一個指向student結構體的指標
{
kind *p;
int i;
char buffer[40];
char *token, *str; //str是從buffer中取出的整行資料,token用來暫存資訊;
char delim[2] = ",";
veg1 *p1, *p2[6]; //p1用于創造新結點,p2用于記錄每個大類遍歷到的當前節點;
p = head->right;
for (i = 1; i < 6; i++)
{
p2[i] = (struct veg1 *)malloc(LEN1); //每一列都有一個表頭空節點;
p2[i]->next = NULL;
p->down = p2[i];
p = p->right;
}
fseek(fp, 69L, SEEK_CUR); //從表格的第二行開始進行讀入
while ((str = fgets(buffer, sizeof(buffer), fp)) != NULL)
{
p = head->right;
token = split(str, delim); //第一格不取
for (i = 1; i < 6; i++)
{
token = split(NULL, delim);
if (token[0] != '\0')
{
p1 = (struct veg1 *)malloc(LEN1);
strcpy(p1->info.name, token);
p1->flag = 0;
p1->next = NULL;
p2[i]->next = p1;
p2[i] = p1;
}
}
p = p->right;
}
}
//字串分割函式類似于strtok,注意若有n個分割符即n+1個資料,此函式將可以有n+2個輸出,最后一個輸出為NULL
char *split(char *strToken, char *strDelimit)
{
char *p;
char *pd;
static char *ps;
if (strToken != NULL)
{
ps = strToken;
while ((*ps != '\0') && (*ps != '\n'))
{
ps++;
}
*ps = 'X'; //X為識別符號,幫助回圈結束
ps++;
*ps = '\0';
ps = strToken;
}
p = ps;
while (*ps != '\0')
{
pd = strDelimit;
while ((*pd != '\0') && (*pd != *ps))
pd++;
if (*pd == *ps)
{
*ps = '\0';
ps++;
return p;
}
else
ps++;
}
if (*(ps - 1) == 'X')
{
*(ps - 1) = '\0';
return p;
}
return NULL;
}
//添加一個排序主鏈,用于對蔬菜基本資訊表中的蔬菜進行排序和匯入大類主鏈
veg1 *sorting_line(FILE *fp)
{
veg1 *head, *cur, *p;
char buffer[500];
char *token, *str; //str是從buffer中取出的整行資料,token用來暫存資訊;
char delim[2] = ",";
head = (struct veg1 *)malloc(LEN1); //表頭空節點;
cur = head;
fseek(fp, 35L, SEEK_CUR); //從表格的第二行開始進行讀入
while ((str = fgets(buffer, sizeof(buffer), fp)) != NULL)
{
p = (struct veg1 *)malloc(LEN1);
token = split(str, delim); //匯入總排序號
p->info.num1 = atoi(token);
printf("%d ", p->info.num1);
token = split(NULL, delim); //匯入蔬菜名稱
strcpy(p->info.name, token);
printf("%s ", p->info.name);
token = split(NULL, delim); //匯入蔬菜分類碼
p->info.num2 = atoi(token); //字串轉整型函式atoi
printf("%d\n", p->info.num2);
token = split(NULL, delim); //匯入營養成分
strcpy(p->info.nutrition, token);
cur->next = p;
cur = p;
p->next = NULL;
}
return head;
}
int main()
{
int i;
kind *head1, *p1; //head1為主鏈型別頭指標,p1用于操作主鏈
veg1 *L_head1[5]; //L_head1為主鏈下屬分鏈頭指標
veg1 *pp[5]; //pp用于操作主鏈下屬分鏈
veg1 *sort_head; //排序鏈表表頭指標
veg1 *tp; //tp為測驗指標
FILE *fp;
//創建主鏈
head1 = creat_trunk();
fp = fopen("C:\\Users\\40375\\Desktop\\課程設計\\任務一資料\\csv\\蔬菜種類資訊表.csv", "r+");
if (fp == NULL)
{
printf("fail to open the file!!!\n");
fclose(fp);
return 0;
}
insert_veg(head1, fp);
p1 = head1->right->right->right->right->right;
L_head1[0] = p1->down->next;
while (L_head1[0] != NULL)
{
printf("%s\n", L_head1[0]->info.name);
L_head1[0] = L_head1[0]->next;
}
fclose(fp);
//初始化五個表頭指標
p1 = head1->right;
for (i = 0; i < 5; i++)
{
L_head1[i] = p1->down;
pp[i] = L_head1[i]->next;
p1 = p1->right;
}
//創造排序鏈
fp = fopen("C:\\Users\\40375\\Desktop\\蔬菜基本資訊表.csv", "r");
if (fp == NULL)
{
printf("fail to open the file!!!\n");
fclose(fp);
return 0;
}
printf("檔案打開成功\n");
sort_head = sorting_line(fp);
tp = sort_head->next;
fclose(fp);
return 0;
}
uj5u.com熱心網友回復:

這個是蔬菜種類資訊.csv的基本內容

這個是蔬菜基本資訊.csv中的基本內容
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/59045.html
標籤:C語言
下一篇:幫忙看一下代碼哪兒有問題
