2012-03-10 87 views
0

这就是我定义我的节点:单链表插入。

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

作业?如果是这样,请使用标签。 – Matthias 2012-03-10 06:39:25

+1

您提到的功能只有代码才能从用户那里获得输入。你似乎没有在这里检查重复用户的代码。请显示该代码,这将有助于回答您的问题。 – Gangadhar 2012-03-10 06:39:44

回答

0

有很多事情你必须考虑。 首先是一个单一的链表,一个体面的数据结构事先知道的事情? 你知道每支球队中可以有这么多球员。而且您没有标准C中的预制搜索或排序功能。实际上,您至少在“查找”至少两个字段,名称字段和位置字段。

如果你可以使用外部库,看看glib http://developer.gnome.org/glib/2.30/glib-Doubly-Linked-Lists.html例如。具有插入到有序列表中的功能。这在这里会很方便。

下一个小提示:Don使用scanf获取用户输入,最好使用fgets和sscanf之外的组合。

现在给你的代码。它没有显示任何尝试在列表中保留订单。因此,您必须在每次插入时都运行列表。而且因为它是一个单链表,所以至少需要检查当前元素名称和以下元素名称。

假设你有亚当 - >奔在您服务,您要添加安东 ,那么你必须要检查的第一个名字亚当<安东和 第二个名字,有你发现安东<本。所以你必须在亚当和本之间插入。

对于您需要打破链表(伪代码(未经测试)) insert_after =亚当 insert_before =奔 为newElement - >未来= insert_before insert_after - >未来=为newElement ....

所以你必须小心。