如何在c语言中对双链表进行选择排序
我在实现双链表的选择排序时面临问题 请有人帮我做选择排序的双链表在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"}; 我构建了一个具有上述节点结构和功能的双
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;
}
}
}