C 按降序排列的链表显示不按顺序显示

C 按降序排列的链表显示不按顺序显示,c,data-structures,linked-list,C,Data Structures,Linked List,我的多项式链表对某些输入不起作用有人能告诉我哪里出错了吗 以下输入不起作用,但 insert(10, 1); insert(20, 2); insert(30, 3); insert(50, 5); insert(60, 6); insert(40, 4); 但这是有效的 insert(60, 6); insert(20, 2); insert(50, 5); insert(40, 4); insert(10, 1);

我的多项式链表对某些输入不起作用有人能告诉我哪里出错了吗

以下输入不起作用,但

 insert(10, 1);
    insert(20, 2);
    insert(30, 3);
    insert(50, 5);
    insert(60, 6);
    insert(40, 4);
但这是有效的

insert(60, 6);
    insert(20, 2);
    insert(50, 5);
    insert(40, 4);
    insert(10, 1);
    insert(30, 3);
#包括
#包括
结构体类型
{
内因系数;
国际战俘;
结构节点*下一步;
};
结构节点*head=NULL;
无效插入(内部系数,内部功率)
{
结构节点*链接=(结构节点*)(malloc(sizeof(结构节点));
链接->系数=系数;
链路->功率=功率;
if(head==NULL)
{
链接->下一步=空;
头=链接;
}
其他的
{
如果(功率>头部->功率)
{
链接->下一步=头部;
头=链接;
}
其他的
{
结构节点*温度=头部;
而((温度->功率>功率+1)和(&(温度->下一步))
温度=温度->下一步;
链接->下一步=临时->下一步;
临时->下一步=链接;
}
}
}
作废打印()
{
结构节点*温度=头部;
while(临时->下一步)
{
printf(“%dx^%d+”,温度->系数,温度->功率);
温度=温度->下一步;
}
printf(“%dx^%d=0”,温度->系数,温度->功率);
}
int main()
{
插入(10,1);
插入(20,2);
插入(30,3);
插入(50,5);
插入(60,6);
插入(40,4);
打印();
返回0;
}
您的迭代逻辑是错误的。我认为您正在尝试将temp迭代到下一个元素应该是link(您的新节点)的位置。但要确定这一立场,你的逻辑是错误的

5 -> 3 -> 1
如果您试图在此处插入2,则在temp=head-5>(2+1)和&temp->next处插入2,这是正确的。因此,您将在5之后插入2,这是不正确的


我避免用勺子喂你这个解决方案。请在这个基础上再接再厉。而且,列表排序似乎与coeff无关,您只是在比较pow。将来,您可能希望从问题中提取出不必要的细节。

您的程序中存在错误、逻辑错误,编译器不会显示这些错误,并且在运行时也不会发生这些错误。让我告诉你们为什么你们的代码在第一组中不起作用。取插入件(10,1)和插入件(20,2)。在第一次插入期间,您的值将存储在第一个节点中,因为第一个if和第二个insert pow期间,值2将与第二个if中的head.pow进行比较,并且存储在head.pow中的值为1,因此第二个if将变为真,并且您的程序将在执行if语句后退出,节点将不被连接,但您的head将被更新到新的链接未连接,并且每次pow>head.pow在第一组输入中时都会发生这种情况。您需要在那里更正您的逻辑。可能是,如果你能为这两组输入共享输出,我将能够为你提供更多帮助,但我说,如果你自己尝试纠正你的逻辑会更好。如果你还需要帮助,请告诉我。

好了,你可以帮你修好了

您必须与下一个电源进行比较并将其添加到列表中

#include <stdio.h>
#include <stdlib.h>
struct Node
{
    int coeff;
    int pow;
    struct Node *next;
};
struct Node *head = NULL;
void insert(int coeff, int pow)
{
    struct Node *link = (struct Node *)(malloc(sizeof(struct Node)));
    link->coeff = coeff;
    link->pow = pow;
    if (head == NULL)
    {
        link->next = NULL;
        head = link;
    }
    else
    {
        if (pow > head->pow)
        {
            link->next = head;
            head = link;
        }
        else
        {
            struct Node *temp = head;
            while (temp->next && (temp->next->pow > pow))
                temp = temp->next;
            link->next = temp->next;
            temp->next = link;
        }
    }
}
void print()
{
    struct Node *temp = head;
    while (temp->next)
    {
        printf("%dx^%d+", temp->coeff, temp->pow);
        temp = temp->next;
    }
    printf("%dx^%d=0", temp->coeff, temp->pow);
}
int main()
{
    insert(70, 7);
    insert(50, 5);
    insert(20, 2);
    insert(10, 1);
    insert(80, 8);
    insert(60, 6);
    insert(30, 3);
    insert(40, 4);
    print();
    return 0;
}
#包括
#包括
结构体类型
{
内因系数;
国际战俘;
结构节点*下一步;
};
结构节点*head=NULL;
无效插入(内部系数,内部功率)
{
结构节点*链接=(结构节点*)(malloc(sizeof(结构节点));
链接->系数=系数;
链路->功率=功率;
if(head==NULL)
{
链接->下一步=空;
头=链接;
}
其他的
{
如果(功率>头部->功率)
{
链接->下一步=头部;
头=链接;
}
其他的
{
结构节点*温度=头部;
同时(临时->下一个&(临时->下一个->功率>功率))
温度=温度->下一步;
链接->下一步=临时->下一步;
临时->下一步=链接;
}
}
}
作废打印()
{
结构节点*温度=头部;
while(临时->下一步)
{
printf(“%dx^%d+”,温度->系数,温度->功率);
温度=温度->下一步;
}
printf(“%dx^%d=0”,温度->系数,温度->功率);
}
int main()
{
插入(70,7);
插入(50,5);
插入(20,2);
插入(10,1);
插入(80,8);
插入(60,6);
插入(30,3);
插入(40,4);
打印();
返回0;
}

和往常一样,在处理列表之类的事情时,我建议你花点时间坐下来,拿一张纸和一支铅笔。在纸上执行所有操作,为列表中的节点绘制小框,并为节点之间的链接绘制箭头。在列表上执行操作时擦除并重新绘制箭头。确保这一切都是你想要的,然后用干净的纸再次这样做,以真正确保。然后你坐在电脑前把它转换成代码。如果你已经得到了代码,那么在监视变量及其值的同时,使用调试器一步一步地检查代码语句。当您逐步完成代码时,再次使用纸和铅笔绘制代码执行的操作。我考虑了一下这个方法,然后实现了它。请解释为什么有时候你会比较
pow
,有时候会比较
pow+1
。请解释一下“不起作用”的确切含义。症状是什么?
5 -> 3 -> 1
#include <stdio.h>
#include <stdlib.h>
struct Node
{
    int coeff;
    int pow;
    struct Node *next;
};
struct Node *head = NULL;
void insert(int coeff, int pow)
{
    struct Node *link = (struct Node *)(malloc(sizeof(struct Node)));
    link->coeff = coeff;
    link->pow = pow;
    if (head == NULL)
    {
        link->next = NULL;
        head = link;
    }
    else
    {
        if (pow > head->pow)
        {
            link->next = head;
            head = link;
        }
        else
        {
            struct Node *temp = head;
            while (temp->next && (temp->next->pow > pow))
                temp = temp->next;
            link->next = temp->next;
            temp->next = link;
        }
    }
}
void print()
{
    struct Node *temp = head;
    while (temp->next)
    {
        printf("%dx^%d+", temp->coeff, temp->pow);
        temp = temp->next;
    }
    printf("%dx^%d=0", temp->coeff, temp->pow);
}
int main()
{
    insert(70, 7);
    insert(50, 5);
    insert(20, 2);
    insert(10, 1);
    insert(80, 8);
    insert(60, 6);
    insert(30, 3);
    insert(40, 4);
    print();
    return 0;
}