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;
} */
}
我正在尝试通过更改链接和地址而不是值来对链表进行升序排列
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;
} */
}