2

提前谢谢了!因此,我已尝试使此功能正常工作。函数中有错误但无法捕捉到它们。在我看来,我错过了排序的逻辑。你能指点我“去哪里”吗?

  /* 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;
}
4

2 回答 2

1
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;

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

于 2013-05-23T23:38:35.867 回答
1

问题是当 currentc 是最后一个节点时, currectc->next 为空,因此 currentc->next->balance 使其崩溃。

添加一些验证,例如
if (currentc->next == null)

并将 b 设置为默认/预定义值或放置一些逻辑,无论是否交换节点。

于 2013-05-23T23:41:23.377 回答