c中链表的升序

Ascending order in linked list in c

我正在尝试通过更改链接和地址而不是值来对链表进行升序排列

struct node
{
    char name[30];
    int percent;
    struct node *link;
};

int main
{
    clrscr();
    randomize();
    struct node *st;
    st=NULL;
    for(int i=0;i<7;i++)
        append(&st,random(101)); //Assigning random values to structure node->percent

    display(st);
    AscMarks(&st); //Changing the order of links and addresses to arrange them in ascending order
    printf("\nAscending order list...\n");
    display(st);
    getch();
    return 0;
}

/*Adds a node at the end of a linked list */
void append(struct node **q,int per)
{
    struct node *temp,*r;
    temp=*q;
    /* If the list is empty , create first node */
    if(temp==NULL)
    {
        temp=(node*)malloc(sizeof(struct node));
        temp->percent=per;
        getName(temp->name);
        temp->link=NULL;
        *q=temp;
    }
    else
    {

        while(temp->link!=NULL)
            temp=temp->link;

        r=(struct node*)malloc(sizeof(struct node));
        r->percent=per;
        getName(r->name);
        r->link=NULL;
        temp->link=r;
    }
}

/*Displays the contents of the linked list */
void display(struct node *q)
{
    while(q!=NULL)
    {
        printf("%d\t%s\n",q->percent,q->name);
        q=q->link;
    }
}

void getName(char *c)
{
    for(int i=0;i<30;i++)
    {
        if(i==10||i==20)
            *(c+i)=' ';
        else
            *(c+i)=(char)((random(26)+97));
    }
    *(c+i+1)='[=10=]';
}

/*To change the links and addresses in order to arrange the percent in ascending order */
void AscMarks(struct node **q)
{
    struct node *temp,*temp1,*r;
    temp=*q;
    //  r=q;
    for(int i=0;i<7;i++,temp=temp->link)
    {       temp1=temp->link;
        for(int j=i+1;j<7;j++,temp1=temp1->link)
        {
            if(temp->percent>temp1->percent)
            {
                r=*q;
                while(r->link!=temp1)
                {
                    r=r->link;
                }
                r->link=temp1->link;

                temp1->link=temp;
                temp=temp1;

            }
        }
        if(i==0)
            *q=temp;
    }

    temp->link=NULL;
    /*
       while(r!=NULL)
       {
       printf("\n%d",r->percent);
       r=r->link;
       } */
}

升序 (AscMarks) 没有给出预期的结果,我无法在代码中看到我的错误请帮助

你没有在最小地址到第二小地址之间建立 link 等等......我已经通过节点变量“*s”得到了 通过 s->link=temp& 将最后排序值(temp)的地址提供给 s..through s=temp.. 并且在每次之后的 "j" 循环中,temp->percent> temp1- >percent .. 你已经完成了 temp1-link=temp,它使 temp1 的地址,起​​始 temp 的地址......简而言之...... "j" 的尝试次数将是太少了,无法比较所有地址……因为其中大部分会重复…… 所以你应该做 j=i;

 void AscMarks(struct node **q)
      {
          struct node *temp,*temp1,*r,*s;
        temp=*q;
        //  r=q;
        for(int i=0;i<7;i++,temp=temp->link)
        {       temp1=temp->link;
            for(int j=i+1;j<7;j++,temp1=temp1->link)
            {
                if(temp->percent>temp1->percent)
                {
                    r=*q;
                    while(r->link!=temp1)
                    {
                        r=r->link;
                    }
                    r->link=temp1->link;
                    j=i;//resetting the value of j
                    temp1->link=temp;
                    temp=temp1;
                    if(i!=0)
                           s-link=temp; //establishing link between 
                           //this sorted address(in this loop) to the
                           //last sorted address                                                            

                }
            }
        if(i==0)
            *q=temp;
        s=temp;//giving it the address of structure which have the last
               //sorted value      
}

temp->link=NULL; //No need to do this
    /*
       while(r!=NULL)
       {
       printf("\n%d",r->percent);
       r=r->link;
       } */
}