C - 从链表中对元素进行排序


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

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

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)中也存在潜在的空取消引用崩溃。 下面的代码显示了避免这种情况的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;
    }
}

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新