gpt4 book ai didi

c++ - C++ 中的链表排序函数不能正常停止

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:50:28 24 4
gpt4 key购买 nike

非常感谢!所以,我已经尝试让这个功能发挥作用。函数中有错误但无法捕获它们。在我看来,我错过了排序的逻辑。你能告诉我“去哪里”吗?

  /* node*/
typedef struct client {
int number; /* */
int balance;/* */
char lastName[20]; /* */
char firstName [20];/* */
char phone[11]; /* */
char email[20];
struct client *prev;/* */
struct client *next;
struct client *tmp; /* */

} Client;
Client *firstc,*currentc,*newc, *a, *b,*tmp; /*pointers*/
/* *"firstc' firstc element in list
*'currentc' current node
*'newc' new node
*'a' temporary pointer to Sort function
*'b' temporary pointer to Sort function
*'tmp' temporary pointer to Sort function
*/
int counter = 0;
int cnum = 0; /*cnum gives unique account numbers avoiding misentering*/

/*---Sort function------*/

void Sort()
{
/* */
int a = 0;/*variables to store balance*/
int b = 0;/*variables to store balance*/
if(firstc==NULL)
printf("Database is empty"); /*message*/

else
currentc = firstc;
currentc->prev = NULL;
tmp = NULL;

while((currentc=currentc->next)!= NULL)
{ /* 1) compare two nodes;
2) IF balance >*/
int a = currentc->balance;
int b = currentc->next->balance;/* debugger stopped here... */

if (a>b)
//if(currentc->balance >currentc->next->balance)
{ /*swap nodes*/

/*code using three pointers*/
tmp = currentc->next;
currentc->next->next = currentc->next;
currentc->next->next = tmp;

}
/*3)move along the list*/
else
currentc = currentc->next;

/*4) repeat to the end of list*/
}
currentc = firstc;
listAll();
return;
}

最佳答案

int b = currentc->next->balance;/* debugger stopped here... */ 

currentc 指向列表中的最后一项时,currentc->next 将为空。所以currentc->next->balance是通过空指针的访问。

另外,在 while((currentc=currentc->next)!= NULL) 这样的条件下进行赋值的做法最终会反过来伤害你。在这种情况下,您似乎跳过了列表中的第一项。

你的意思可能是:

if(firstc == NULL)
printf("Database is empty"); /*message*/
else
{ /* missing braces spotted by others */
currentc = firstc;
currentc->prev = NULL;
tmp = NULL;


for( ; currentc != NULL; currentc = currentc->next)
{
if(currentc->next == NUL)
/* nothing to compare */
break;
...
}
}

此外,交换代码正在交换错误的节点:

    tmp = currentc->next;
currentc->next->next = currentc->next;
currentc->next->next = tmp;

将几乎(但不完全)交换下一个节点 (b),而不是 (a)。您需要使用 prev 指针(但是因为这看起来像是家庭作业,所以我最好不要告诉您确切的操作方法)。此外,您正在初始化 prev 但您需要在循环中使其保持最新。实际上,您上面的 3 行相当于:

    tmp = currentc->next;
currentc->next->next = tmp;

所以我认为你的意思是别的。

关于c++ - C++ 中的链表排序函数不能正常停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16725540/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com