如何在c语言中对双链表进行选择排序

如何在c语言中对双链表进行选择排序,c,algorithm,sorting,pointers,doubly-linked-list,C,Algorithm,Sorting,Pointers,Doubly Linked List,我在实现双链表的选择排序时面临问题 请有人帮我做选择排序的双链表在c 节点结构是: struct node { char name [15]; node * nextnode; node * prevnode; }node; 我按姓名排序 代码如下: 我需要按名称的升序对列表进行排序 char names[5][15] = {"tom","jack","mike","bernard","leo"}; 我构建了一个具有上述节点结构和功能的双

我在实现双链表的选择排序时面临问题

请有人帮我做选择排序的双链表在c

节点结构是:

struct node {
         char name [15];
         node * nextnode;
         node * prevnode;
}node;
我按姓名排序

代码如下:

我需要按
名称的升序对列表进行排序

char names[5][15] = {"tom","jack","mike","bernard","leo"};
我构建了一个具有上述节点结构和功能的双链表,如下所示:

int list_add(char *lname)
{
    int i, length;
    struct node *current = NULL;
    struct node *temp = NULL;
    current = head;
    while (current->nextnode != NULL)
    {
        current = current->nextnode;
    }
    temp = malloc(sizeof(struct node));
    current->nextnode = temp;
    strcpy(temp->name,lname);
    temp->prevnode = current;
    temp->nextnode = NULL;

    return 0;
}

int init_list(char names[][15])
{
    int length;
    struct node * current = NULL;
    head = malloc(sizeof(struct node));
    strcpy(head->name,"Head");
    head->nextnode = head->prevnode = NULL;
    for(length = 0; length < 5; length++)
    {
        //printf("names are %s \n", (char *)names[length]);
        list_add(names[length]);
    }

    return length;
}
上述实现无法对双链接列表进行排序

我将无限循环输出:

在国际热核聚变实验堆之后,4个名字是迈克

在国际热核聚变实验堆之后,4个名字是迈克

在国际热核聚变实验堆之后,4个名字是迈克

在国际热核聚变实验堆之后,4个名字是迈克

请有人给我的实施修复或新的实施建议(参考链接)。
提前谢谢。

为什么你认为它不起作用?在SO上抛出代码,并要求其他人调试它,而不详细说明您所经历的步骤,包括您所看到的问题,这是毫无成效的。当你运行这个时会发生什么?名单上有什么事吗?没有什么?它是否产生了错误的顺序?它可能有助于你解决问题(尽管没有公认的答案),甚至(除此之外,我倾向于同意WhozCraig)。@WhozCraig@Dukeling:我已经更新了我的问题,并提供了足够的清晰和解释。如果我的问题中遗漏了任何不能让你为我提供建议/解决方案的地方,请告诉我。@Dukeling,给出的参考是针对单链表的。如何调试双链表。您的代码不能编译,既不作为C也不作为C++。
int selsort(int length)
{
    int i = 0,j = 0;
    struct node *start = NULL;
    struct node *prev, *next, *temp, *temp1;
    struct node *current = NULL;
    struct node *traversal = NULL;
    prev = next = NULL;
    if (head == NULL)
        return 0;
    start = head;
    printf("selsort called \n");
    for(/*start = head->nextnode*/; start != NULL && i < 6; /*start = start->nextnode*/)
    {
        printf("Iteration number %d \n",i);
        start = head->nextnode;
        j = i;
        while(j)
        {
            start = start->nextnode;
            j--;
        }
        printf("start node %s \n",start->name);
        temp1 = start;
        current = start;
        temp = start;
        while(current != NULL)
        {
            if(strcmp(temp->name, current->name) > 0)
            {
                //ascending logic
                temp = current;
                current = current->nextnode;
            } 
            else 
                current = current->nextnode;
        }
        //printf("Before swap logic \n");
        //swap logic
        if(temp1->prevnode == NULL)
        {
            //swap current with temp
            next = temp1->nextnode;
            temp1->nextnode = temp->nextnode;
            temp1->prevnode = temp->prevnode;
            temp->nextnode->prevnode = temp1;
            temp->prevnode->nextnode = temp1;
            temp->nextnode = next;
            temp->prevnode = NULL;
            next->prevnode = temp;

        }else
        {
            //printf("second swap : %d \n",i);
            if(temp1->nextnode == NULL)
                continue;
            else 
            {
                next = temp1->nextnode;
                prev = temp1->prevnode;
                if (temp->nextnode == NULL)
                {
                    temp1->nextnode = NULL;
                    temp1->prevnode = temp->prevnode;
                    temp->prevnode->nextnode = temp1;
                }else{
                    temp1->nextnode = temp->nextnode;
                    temp1->prevnode = temp->prevnode;
                    temp->nextnode->prevnode = temp1;
                    temp->prevnode->nextnode = temp1;
                }
                temp->prevnode = prev;
                temp->nextnode = next;
                next->prevnode = temp;
                prev->nextnode = temp;
            }
        }
        i++;

        traversal = head;
        while(traversal != NULL)
        {
            printf("after iter %d Names are %s \n",i, traversal->name);
            traversal = traversal->nextnode;
        }
    }
}