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

时间:2013-07-19 23:51:39

标签: c linked-list trace

我正在尝试将节点添加到链接列表中。我们的想法是传入指针,查看新节点将通过排序顺序的位置,在本例中为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;
    }
}

以下是我提出的列表功能。它一直说我的链表是空的。也许这个功能有问题。

int print(struct player* list){
    // create temp list so non modify origin.
    struct player* temp = list;
    if (list == NULL && temp == NULL)
        printf("linked list is empty");
    while (temp != NULL){
        printf("%s \n", temp->lname);
        printf("%s \n", temp->fname);
        printf("%c \n", temp->pos);
        printf("d \n", temp->val);
        temp = temp->next;
    }
return 0;
}

2 个答案:

答案 0 :(得分:0)

好的,我理解的是你的玩家结构包含一个变量pos,它将指示将玩家插入列表的位置。我对吗 ?

在这种情况下,您可以做的最好的事情是按等级变量对列表进行排序。然后修改你的pos变量(在播放器结构中)以匹配列表的rank变量。

然后,您只需添加经典的“添加排序列表”功能:C++ Add to linked list in sorted order enter link description here

答案 1 :(得分:0)

在不知道玩家typedef的情况下,这很难分析,但我认为你可以通过简化函数的签名来仅仅使用玩家来让自己变得更容易。

void addp(player* newnode, player* firstnode)

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