簡體   English   中英

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)='\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-> link = temp&通過節點變量“ * s”獲得了最后排序值(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;
       } */
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM