c - c中链表的升序

标签 c pointers struct linked-list

我试图通过更改链接和地址而不是值来在链接列表中进行升序

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)='\0';
}

/*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) 未按预期给出结果,我无法看到代码中的问题,请帮忙

最佳答案

您没有在最小地址到第二小地址之间建立链接,依此类推...我通过节点变量“*s”得到了这一点 通过 s->link=temp& 将最后一个排序值(temp)的地址提供给 s..通过 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;
       } */
}

关于c - c中链表的升序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29997744/

相关文章:

c++ - 使用 C++ 方式对结构和数组进行别名处理

c - CLOCK_MONOTONIC 和 CLOCK_MONOTONIC_COARSE 是否具有相同的基数?

c - 将 *next 列表指针设置为 NULL

c++ - 按值传递与按引用或指针传递的性能成本?

c - 递归释放 C 结构

c - C 结构填充是否使这种使用不安全?

c - 这个双循环的复杂性是什么

c - Linux block 设备驱动程序请求排序 - RaW?

通过将指针传递给 c 中的函数来创建二维数组

使用 C 将 ppm 文件从 P3 转换为 P6