我试图通过更改链接和地址而不是值来在链接列表中进行升序
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/