c - 如何正确构建具有字符结构的链表
问题描述
我有一个动态结构链表,我需要创建以下函数:
1. 将从文本文件中加载数据。
2. 将新元素添加到我的链表结构中。
3.输出我的链表中存在的所有数据。
我也有菜单,所以我调用这些函数在控制台中输入我需要的内容。我想我在动态数据分配和指针方面存在问题。
https://imgur.com/a/8ynqar8
我已经在这几天苦苦挣扎,试图用正确的分配指针解决问题。
#define MES_LEN 100
#define m 23
typedef struct {
char index[m];
char name[MES_LEN];
char release[MES_LEN];
char length[MES_LEN];
char artist[MES_LEN];
} INFORM;
typedef struct list_elem {
INFORM inform;
struct list_elem *next;
}
LEL;
LEL* list;
void AddElement(void); // Writing new element to file (DATAinput)
void LoadData(void); // Reading previously written data
void ReadElement (void); // Reading data from existing file data (DATA)
void OutpuAll(void); // Output in console all previously added data from both files
int menu(void);
int main() {
...
case 1: OutpuAll(); break; // Output all data
case 2: AddElement(); ReadElement(); break; // Add element to file
case 3: LoadData(); break; // Loading data from the file
...
}
void AddElement (void) // I have an empty file that i fill and then read and link to my main structure(this works fine)
{
char albN[25], albR[11], albL[11], albA[25], albI[5];
FILE * fileD;
fileD = fopen("DATAinput.txt", "r");
...
printf("Enter album artist \n");
scanf("%s", albA);
fprintf(fileD, "%s ", albA);
fclose(fileD);
}
void ReadElement (void) // Reading previously written data(AddElement)
{
LEL *ptr;
ptr = (LEL*)malloc(sizeof(LEL));
FILE * fileD;
fileD = fopen("DATAinput.txt", "r");
if (fileD == NULL) {
printf("Can not open the file\n");
exit(1);
}
while(fscanf (fileD, "%s %s %s %s %s", ptr->inform.index, ptr->inform.name, ptr->inform.release, ptr->inform.length, ptr->inform.artist) != EOF)
{ ptr->next=NULL;
printf("\n Id:%s Album: %s Released: %s Length: %s Artist: %s", ptr->inform.index, ptr->inform.name, ptr->inform.release, ptr->inform.length, ptr->inform.artist); }
fclose(fileD);
free(ptr);
}
void LoadData(void)
// Reading existing data from file
{
LEL *current, *head;
LEL *ptr;
ptr = (LEL*)malloc(sizeof(LEL));
FILE * file;
file = fopen("DATA.txt", "r");
if (file == NULL) {
printf("Can not open the file\n");
}
while(fscanf (file, "%s %s %s %s %s", ptr->inform.index, ptr->inform.name, ptr->inform.release, ptr->inform.length, ptr->inform.artist) != EOF)
{ printf("\n %s Album: %s Released: %s Length: %s Artist: %s", ptr->inform.index, ptr->inform.name, ptr->inform.release, ptr->inform.length, ptr->inform.artist); }
fclose(file);
ptr->next = NULL;
}
void OutpuAll(void) // Trying to output data that i previously loaded from files to structure.
{
LEL *ptr;
LEL* ptr = list;
while (ptr!=NULL) {
printf("\n Id:%s Album: %s Released: %s Length: %s Artist: %s", ptr->inform.index, ptr->inform.name, ptr->inform.release, ptr->inform.length, ptr->inform.artist);}
}
ptr = ptr->next;
}
我在这些函数的末尾遇到了一些问题
void ReadElement (void)
void LoadData(void)
void OutpuAll(void)
我将不胜感激
解决方案
代码存在多个问题。
- 您正在使用 写入文件,
AddElement
然后使用ReadElement
. 从第二项开始,您将阅读 read 函数中的所有元素。所以如果你写了10张专辑,你ReadElement
每次都会读完。对于下一次写入,您将丢弃读取到链表中的 10 个相册并再次读取 11 个相册。
ReadElement
在这种情况下不做功能,可以丢弃。
in
AddElement
,您仅albA
在读取许多其他参数时才写入ReadElement
AddElement
"r"
以将文件指针设置为文件开头的模式打开文件。您需要在"a"
模式下打开它
还有其他问题,可以看下面的代码供参考。
LEL *head = NULL;
LEL *currrent = NULL;
void AddElement (void) // I have an empty file that i fill and then read and link to my main structure(this works fine)
{
char albN[25], albR[11], albL[11], albA[25], albI[5];
FILE * fileD;
fileD = fopen("DATAinput.txt", "a");
printf("Enter album artist \n");
scanf("%s", albA);
fprintf(fileD, "%s ", albA);
// add other scanf and fprintfs
fclose(fileD);
}
void LoadData(void)
{
LEL *ptr;
FILE * file;
file = fopen("DATA.txt", "r");
if (file == NULL) {
printf("Can not open the file\n");
}
while(fscanf (file, "%s %s %s %s %s", ptr->inform.index, ptr->inform.name, ptr->inform.release, ptr->inform.length, ptr->inform.artist) == 5)
{
ptr = malloc(sizeof(LEL));
ptr->next=NULL;
printf("\n %s Album: %s Released: %s Length: %s Artist: %s", ptr->inform.index, ptr->inform.name, ptr->inform.release, ptr->inform.length, ptr->inform.artist);
if (head == NULL)
{
head = ptr;
current = ptr;
}
else
{
current ->next = ptr;
current = current->next;
}
}
fclose(file);
}
void OutpuAll(void) // Trying to output data that i previously loaded from files to structure.
{
LEL *ptr;
LEL* ptr = head;
while (ptr!=NULL) {
printf("\n Id:%s Album: %s Released: %s Length: %s Artist: %s", ptr->inform.index, ptr->inform.name, ptr->inform.release, ptr->inform.length, ptr->inform.artist);
ptr = ptr->next;
}
}
推荐阅读
- javascript - 更改主要内容而不更改整页
- python - PySNMP:如何在同一个代理中实现 CommandResponder 和 NotificationOriginator?
- reactjs - 没有根据反应中的状态变化触发 UseEffect
- reactjs - 在 Github 上托管后,带有 React 的 Twilio Chat API 无法正常工作
- php - 将函数名称传递给其他函数并从 PHP 中的不同文件调用
- node.js - 使用 npx 运行包时访问 node_modules 中的文件
- javascript - 在javascript nodejs中展平和排序嵌套数组
- apache-spark - Spark Structured Streaming - 根据条件连接 2 个数据帧
- c# - 在 .net 5 上使用 mongodb 驱动程序时出现 System.PlatformNotSupportedException
- python - 同步两个独立进程Python的输出