gpt4 book ai didi

c - 如何使用char结构正确构建链表

转载 作者:太空宇宙 更新时间:2023-11-03 23:58:07 25 4
gpt4 key购买 nike

我有一个动态结构链表,我需要创建以下函数:
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)

我将不胜感激

最佳答案

代码存在多个问题。

  1. 您正在使用 AddElement 写入文件,然后使用 ReadElement 读取。从第二项开始,您将读取 read 函数中的所有元素。所以如果你写了 10 张专辑,你每次都会在 ReadElement 中读取所有这些专辑。下一次写入时,将读入链表的10张专辑丢弃,重新读取11张专辑。

ReadElement 在这种情况下没有执行功能,可以丢弃。

  1. AddElement 中,您只写入了 albA,而在 ReadElement

    中读取了许多其他参数<
  2. 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;
}
}

关于c - 如何使用char结构正确构建链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56784248/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com