gpt4 book ai didi

C:链表并写入文件

转载 作者:行者123 更新时间:2023-11-30 16:46:55 24 4
gpt4 key购买 nike

我在链接列表并将其内容写入文件时遇到一些问题。我编写了一些与链表一起使用的函数(您可以在开头/结尾插入节点,在第 n 个位置删除节点或搜索一个元素,然后将其删除)。所有这些功能都可以正常工作。如果我显示链接列表的内容,一切都很好,正如预期的那样。但是当我尝试删除一个节点然后将链表的内容写入文件时出现问题,有很多垃圾值。如果我在列表的开头/结尾插入一个节点,它会正确显示文件。仅当删除节点时才会出现问题。每次更新链表时,都会重写文件。以下是将内容写入文件的函数:

void writetofile(const STUDENT *head,FILE *fw)
{

if(head == NULL)
{
fprintf(stderr,"Ziadne zaznamy\n");
return;
}
while(head!=NULL)
{
fprintf(fw,"%s %s %c %.2lf \n",head->meno,head->priezvisko,head->pohlavie,head->priemer);
head = head->next;
}

return;
}

此函数显示文件的内容:

void showfile(FILE *f)
{
int c;
while((c=getc(f))!=EOF)
putchar(c);
printf("\n\n");
}

该程序由使用 switch 语句的简单菜单驱动,如下所示:

do
{
puts("\nYour choice:(q) to quit");
printf("a:insert at the begining\tb:insert at the end\n");
printf("c: delete from nth position\td:search for a name and delete\n");
printf("e: display file\n");


switch(choice = toupper(getchar()))
{

case 'A':
pridajstudentanazaciatok(&head,tempmeno,temppriezvisko,temppohlavie,tempznamky);
rewind(subor);
writetofile(head,subor);
break;

case 'B':
pridajstudentanakoniec(&head,tempmeno,temppriezvisko,temppohlavie,tempznamky);
rewind(subor);
writetofile(head,subor);
break;

case 'C':
vymazzpozicie(&head,poziciaStudenta);
rewind(subor);
writetofile(head,subor);
break;

case 'D':
vymazstudenta(&head,temppriezvisko);
rewind(subor);
writetofile(head,subor);
break;

case 'E':
rewind(subor);
showfile(subor);
break;

default:
break;
}
}while(choice!='Q');

正如我所说,当链表更新时,文件会被重写。

这是从第 n 个位置删除节点的函数:

void vymazzpozicie(STUDENT **head,int pozicia)
{
if(*head==NULL)
{
fprintf(stderr,"Prazdny zoznam.\n");
return;
}
int i = 0;
STUDENT *temp1 = *head;
if(pozicia == 0)
{
*head = temp1->next;
free(temp1);
return;
}
while(i != (pozicia-1))
{
temp1 = temp1->next;
i++;

}

STUDENT * temp2 = temp1->next;
temp1->next = temp2->next;
free(temp2);
return;
}

此函数搜索节点并将其删除:

void vymazstudenta(STUDENT **head,const char *priezvisko)
{

STUDENT *traverse = *head;
STUDENT *previous = NULL;
if(*head == NULL || priezvisko==NULL)
{
fprintf(stderr,"Nespravny vstup.\n");
return;
}
while( traverse != NULL )
{
if( strcmp(traverse->priezvisko,priezvisko) == 0 )
{
if( previous == NULL )
{
*head = traverse->next;
}
else
{
previous->next = traverse->next;
}
free( traverse );
return;
}
else
{
previous = traverse;
traverse = traverse->next;
}
}

fprintf(stderr,"Student %s sa nenasiel.\n",priezvisko);

return;

}

有人可以帮助我吗?谢谢。

最佳答案

此删除函数有一个主要错误:您假设您要查找的位置存在

试试这个:

void vymazzpozicie(STUDENT **head,int pozicia)
{
if(*head==NULL)
{
fprintf(stderr,"Prazdny zoznam.\n");
return;
}
int i = 0;
STUDENT *temp1 = *head;
if(pozicia == 0)
{
*head = temp1->next;
free(temp1);
return;
}
while(temp1 != NULL && i != (pozicia-1))
{
temp1 = temp1->next;
i++;

}

if(temp1 == NULL || temp1->next == NULL){
// print some error
return;
}

STUDENT * temp2 = temp1->next;
temp1->next = temp2->next;
free(temp2);
return;
}
<小时/>

更新

而不是使用 rewind()函数我建议使用 freopen(...) 重新打开文件因为:如果您使用 rewind() 删除一个元素您只会覆盖前 N-1 个元素的文件内容,将第 N 个元素保留在文件中。相反,您需要始终清除所有文件。

关于C:链表并写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43546897/

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