从链表中排序元素

时间:2013-07-23 16:33:43

标签: c sorting data-structures linked-list

void sortlist()
{
    struct node *a;
    struct node *temp=head;

    struct node *temp1=head->next;

    while(temp!=NULL)
    {
        while(temp1->next!=NULL)
        {
            if(temp->data > temp1->data)
            {
                a->data=temp->data;
                temp->data=temp1->data;
                temp1->data=a->data;
            }
            else
            {
                temp1=temp1->next;
            }
        }
        temp=temp->next;
    }
}

//我是数据结构的新手。我在尝试对链接列表的元素进行排序时遇到了一些问题。列表没有得到排序。非常感谢任何帮助。

3 个答案:

答案 0 :(得分:4)

a是一个未初始化的指针,所以行

a->data=temp->data;

调用未定义的行为。崩溃是最可能的结果,因为您将尝试在未定义的地址写入内存,该地址可能无法由您的代码写入,或者可能被您程序的其他部分使用。

您可以通过提供与a相同类型的temp->data来解决此问题。

void sortlist()
{
    int a; // change type to match node->data if required
    ...
            if(temp->data > temp1->data)
            {
                a=temp->data;
                temp->data=temp1->data;
                temp1->data=a
            }
    ...
}

编辑:行while(temp1->next!=NULL)中还存在潜在的NULL解除引用崩溃。下面的代码显示了sortlist的潜在实现,避免了这种情况。

void sortlist()
{
    struct node *ptr=head;
    while(ptr!=NULL) {
        struct node *next;
        if (ptr == NULL)
            return;
        next = ptr->next;
        while(next!=NULL) {
            if(ptr->data > next->data) {
                int a=ptr->data;
                ptr->data=next->data;
                next->data=a;
            }
            next = next->next;
        }
        ptr=ptr->next;
    }
}

答案 1 :(得分:0)

我在代码中进行了更改并添加了更改的注释

void sortlist()
{

    // struct node *a; /* this is not required. */

    /* NULL checks are required,if head is NULL,head->next will crash.*/
    if(head == NULL || head->next == NULL) return;

    struct node *temp=head;

    struct node *temp1=head->next;

    while(temp!=NULL)
    {
        while(temp1->next!=NULL)
       {

           if(temp->data > temp1->data)
           {
                /* assuming you data is integer*/
                int d=temp->data;
                temp->data=temp1->data;
                temp1->data=d;
           }
           //else /* else is not required, better to remove it.*/
           //{
                temp1=temp1->next;
           //}
       }
    temp=temp->next;
    }
}

答案 2 :(得分:0)

//最后我找到了自己问题的答案,这就是解决方案,感谢您的帮助伙伴

void sortlist()
{
    struct node *temp=head;
    int s;
    struct node *temp1=temp->next;

    while(temp!=NULL)
    {
        temp1=temp->next;                       
        while(temp1!=NULL)
        {
            if(temp->data > temp1->data)
            {
                s=temp->data;
                temp->data=temp1->data;
                temp1->data=s;
            }
            temp1=temp1->next;
        }
        temp=temp->next;
    }
}