【发布时间】:2017-12-03 23:50:02
【问题描述】:
我真的需要你的帮助来完成我的程序。我是 C 的新手,需要在我的项目中创建一个链表。
我在 macOS 上使用 xcode。 我的代码在这里:
typedef struct person
{
char name[500];
char telnum[16];
char wohnort[500];
struct person *next;
}person;
person *head=NULL;
void einlesen()
{
person *p;
char name[30];
char telnum[16];
char wohnort[30];
//char buff1[15], buff2[15];
int cnt=0;
FILE *fp=fopen("Data2.txt", "r");
if(fp==NULL)
{
printf("File konnte nicht geoeffnet werden!\n");
exit(1);
}
while(fscanf(fp," %29[A-z ]\t%s\t%s", &name, &telnum, &wohnort)!=EOF)
{
cnt++;
printf("Datei gefunden!\nDaten:%s, %s, %s\n", name, telnum, wohnort);
if(head == NULL){
head = (person*)malloc(sizeof(person));
strcpy(head->name, name);
strcpy(head->telnum, telnum);
strcpy(head->wohnort, wohnort);
head->next = NULL;
}
else{
p = head;
while(p->next != NULL)
{
p = p->next;
}
p->next = (person*)malloc(sizeof(person));
strcpy(p->next->name,name);
strcpy(p->next->telnum,telnum);
strcpy(p->next->wohnort,wohnort);
p->next->next = NULL;
}
}
printf("Die Daten von %d Personen wurden eingelesen!\n\n", cnt);
fclose(fp);
}
void addieren()
{ char name[30];
char telnum[16];
char wohnort[30];
person *p = head;
printf("Bitte den Namen der hinzufuegenden Person eingeben:\n");
scanf(" %29s", name);
while(getchar() != '\n');
printf("\nBitte die Telefunnumer der hinzufuegenden Person eingeben:\n");
scanf(" %15s", telnum);
while(getchar() != '\n');
printf("\nBitte den Wohnort der hinzufuegenden Person eingeben:\n");
scanf(" %29s", wohnort);
while(getchar() != '\n');
if(p==NULL) return;
while(p->next)
{
p=p->next;
}
p->next = (person*)malloc(sizeof(person));
strcpy(p->next->name, name);
strcpy(p->next->telnum, telnum);
strcpy(p->next->wohnort, wohnort);
p->next->next=NULL;
}
我的主要功能中有这个:
int main()
{
person *p1=head;
einlesen();
addieren();
while(p1 !=NULL)
{
printf("Namen: %s\n", p1->name);
p1=p1->next;
}
return 0;
}
它已经从文件中读取了数据,我想向它添加一些新记录并打印到屏幕上。这将返回 0 并且不会真正在屏幕上打印列表。
稍后我需要在我的程序中添加更多功能,例如: - 从列表中删除 -修改元素 - 在链表中搜索 - 保存到文件 -还有一个菜单
【问题讨论】:
-
您在哪方面需要帮助?具体来说,您能否更新您的问题以包括:您希望该程序做什么?它实际上是做什么的?到目前为止,您做了什么(如果有的话)来尝试修复它?
-
发布的代码缺少
stdio.h、stdlib.h所需的#include语句 -
@user3629249 代码开头有#include语句,只是这里没有贴出来。
-
@TimSweet 所以程序必须从我创建的文件中读取数据(确实如此),并且我想使用此功能将新记录添加到列表中。在我运行“addieren”(addtolist)函数后,我想将新列表打印到输出中以检查它是否正确添加了它
-
关于:`while(fscanf(fp," %29[A-z ]\t%s\t%s", &name, &telnum, &wohnort)!=EOF)` 更好地检查成功而不是单一的故障模式。建议检查 (!=3)。 2) 当使用 '%s' 或 '%[...]' 输入说明符时,始终包含一个比输入缓冲区长度小 1 的 MAX CHARACTERS 修饰符。 a) 因为 NUL 字节将始终附加到输入数据和 b) 以避免任何缓冲区溢出的可能性。这种缓冲区溢出是未定义的行为,可能导致段错误事件。
标签: c data-structures struct linked-list