这就是我定义节点的方式:
struct node
{
char familyName[1023];
char firstName[1023];
char position;
int value;
struct node *next; // points to the next node in list
} Node;
我需要创建插入函数来检查重复的姓氏,然后根据姓氏添加播放器(忽略名字)。另外,我必须根据他们的位置对球员进行排序,所以所有的守门员都将是第一个,然后是防守者。
这就是我的开始,但我似乎陷入困境,不确定该怎么做。请帮忙。
struct Node* insert (struct Node *head)
{
struct Node *temp;
if (head == NULL)
{
head=(struct Node *)malloc(sizeof(struct Node));
if(head==NULL)
{
printf("Error! memory is not available\n");
exit(0);
}
}
printf(" family name: ");
safegets(head->familyName, MAX_LENGTH+1);
printf(" first name: ");
safegets(head->firstName, MAX_LENGTH+1);
printf(" position: ");
scanf("%c", &(head->position));
getchar();
printf(" value: ");
scanf("%d", &(head->value));
getchar();
}
但是,我认为我没有正确地做,并且应该有另一个节点,它将存储姓氏的名字位置和值,然后进行比较,然后将其添加到头部。请帮忙。
答案 0 :(得分:0)
你需要考虑很多事情。 首先,单个链表是您事先知道的事情的体面数据结构吗? 你知道每支球队中都有这么多球员。并且您没有标准C中可用的预制搜索或排序功能。事实上,您正在“查看”至少两个字段,即名称字段和位置字段。
如果您可以使用外部库,请查看glib http://developer.gnome.org/glib/2.30/glib-Doubly-Linked-Lists.html,例如。具有插入有序列表的功能。那在这里会很方便。
下一个小提示:Don使用scanf来获取用户的输入,更好地使用fgets和sscanf的组合。
现在给你编码。它没有显示任何尝试在列表中保留订单。因此,您必须在每次插入时运行列表。因为它是单个链表,所以至少需要检查当前元素名称和以下元素名称。
假设你有亚当 - > Ben在你的名单中,你想添加Anton 然后你必须检查名字Adam<安东和 第二个名字,你在那里找到安东<本。所以你必须在Adam和Ben之间插入。
为此你需要打破链表(伪代码(未经测试)) insert_after =亚当 insert_before = Ben newElement - > next = insert_before insert_after - > next = newElement ....
所以你必须要小心。