Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中的特定位置添加链表中的节点_C_Linked List_Trace - Fatal编程技术网

在C中的特定位置添加链表中的节点

在C中的特定位置添加链表中的节点,c,linked-list,trace,C,Linked List,Trace,我正在尝试将节点添加到链接列表中。其思想是传入指针,查看新节点将通过排序顺序到达的位置,在本例中是G,然后是D,然后是M,然后是S 然而,当我编译和运行时,我实际上并没有生成一个链表(这在主程序中已经完成了)。我非常确定我的addp()函数有问题。是不是我应该用双指针来代替? 很抱歉,我太不专业,太无知了。我不是最强的程序员 任何帮助都会有帮助 我已经附上我的方法,我已经经历了很多次 typedef struct node { char fname[1024]; char lname[1024]

我正在尝试将节点添加到链接列表中。其思想是传入指针,查看新节点将通过排序顺序到达的位置,在本例中是G,然后是D,然后是M,然后是S

然而,当我编译和运行时,我实际上并没有生成一个链表(这在主程序中已经完成了)。我非常确定我的addp()函数有问题。是不是我应该用双指针来代替? 很抱歉,我太不专业,太无知了。我不是最强的程序员

任何帮助都会有帮助

我已经附上我的方法,我已经经历了很多次

typedef struct node {
char fname[1024];
char lname[1024];
char pos;
int val;
int rank;
struct node * next;
} player;


    struct node* addp (player* newnode, struct node* list){
    player* templist = list;
        player* templist1;
    // if the list is non empty.
    if (list!=NULL){
        if(newnode->pos == GOALKEEPER){  //insert if G.
            newnode->next = list;
        }
        if(newnode->pos == DEFENDER){// after G bef M.
            // iterate through templist.
            while (templist->next != NULL && (templist->next)->rank < 1) {  // go to end of G.
                // when the list isn't empty next node rank is less than one, keep going
                templist = templist -> next;
            }
            // when finally rank == or > 1, then add newnode.
            templist1 = templist->next;
            templist->next = newnode;
            newnode->next = templist1;
        }
        if(newnode->pos == MIDFIELDER){ //after G and M but before S
            while (templist->next != NULL && (templist->next)->rank <2 && (templist->next)->rank> 2){
                templist = templist -> next;
            }
            // when stopped, then add newnode.
            templist1 = templist->next;
            templist->next = newnode;
            newnode->next = templist1;
        }
        if(newnode->pos == STRIKER){ // at the end.
            while (templist->next != NULL && (templist->next)->rank <3){
                templist = templist -> next;
            }
            templist1 = templist->next;
            templist->next = newnode;
            newnode->next = templist1;
        }
        return list;
        printf("player added");
    }
    // if list is empty
    else{
        newnode->next = list;
        return 0;
    }
}

好的,我理解的是,你的播放器结构包含一个变量pos,它将指示在列表中插入播放器的位置。我说得对吗

在这种情况下,您可以做的最好的事情是按秩变量对列表进行排序。然后修改pos变量(在player结构中)以与列表中的秩变量匹配


然后,您只需添加一个经典的“外接程序排序列表”函数:

而不知道播放器类型。这很难分析,但我认为您可以通过简化函数签名,使其仅使用播放器,从而使分析变得更简单

void addp(player* newnode, player* firstnode)

返回是不必要的,因为您只是返回调用者已经拥有的第二个参数。第二个参数应该是指向播放器节点的指针,它是链接列表中的第一个元素。如果您可以在编译器没有抱怨隐式转换指针的情况下调用该函数,那么我看不出您的算法有任何错误,尽管它肯定可以简化。

EDIT:我包括了typedef。EDIT:我还包括了display函数,它列出了各个节点中的数据。我看到了。因此,取消返回类型绝对是明智的。好啊我已被告知,将传入
player**newnode
player**firstnode
而不是当前的单指针。这会大大简化我的算法吗?顺便说一句,谢谢你的帮助。我想你不想传球给别人。这对你没什么帮助。最重要的是要确保你传递的是列表中第一个玩家的地址。因此,当调用函数时,如果“newnode”和“firstnode”是指针,则按如下方式传递它们:
addp(newnode,firstnode)
但如果它们是局部变量,则按如下方式传递它们:
addp(&newnode,&firstnode)
。同样,如果你把它搞砸了,编译器应该会抱怨。嗯,一切似乎都很好。只是当我运行我的链表列表时,它显示链表中没有任何内容。我会发布它,希望有人能在列表函数中发现一个错误。哦,你是完全从这个函数填充你的链表的吗?如果是这样的话,这就解释了问题所在。此函数无法更新列表的开头。我建议将调用函数更改为手动执行此操作,因为这样更容易,但是如果您想使用addp执行此操作,那么实际上应该为列表传递一个双指针。然后,当您将它分配给templist并将函数的结尾更改为
else{list=newnode}
时,请取消对它的引用一次。我已经按照步骤为list传递了一个双指针。现在,编译器抛出一个
错误:请求非结构或联合中的成员“lname”以及相关错误。很抱歉这么困惑,谢谢你的帮助,但是我应该如何调用它们来编辑它们呢?这就是我在代码中要做的,是的。问题是,在我运行完该方法后,它实际上并没有在一天结束时修改列表。好的,所以您只需按地址通过列表的第一个节点。正如你在其他评论中所说。但您不必通过要按地址添加的节点。所以函数应该是这样的:void addp(player*newnode,player**list){…}
void addp(player* newnode, player* firstnode)