单链表插入。

时间:2012-03-10 06:34:23

标签: c

这就是我定义节点的方式:

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();
}

但是,我认为我没有正确地做,并且应该有另一个节点,它将存储姓氏的名字位置和值,然后进行比较,然后将其添加到头部。请帮忙。

1 个答案:

答案 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 ....

所以你必须要小心。