单链表的问题

来源:百度知道 编辑:UC知道 时间:2024/06/18 11:17:20
像插入一个数值,插入按大小顺序!
正确的如下:
void inslink(stu *st)
{
stu *q,*p;
if(head==NULL)
{head=st;
st->next=NULL;
return;}
p=head;
if(p->score>st->score)
{st->next=p;//为什么我直接用st->next=p;head=st会不对!
p=st;;//为什么我直接用st->next=p;head=st会不对!
}
while(p&&p->score<st->score)
{q=p;
p=p->next;
}
st->next=q->next;
q->next=st;
}
问题1:为什么我直接用st->next=p;head=st会不对!

我又改了程序
void inslink(stu *st)
{
stu *p;
if(head==NULL)
{head=st;
st->next=NULL;}
p=head;
while(p&&p->score>st->score)
{
p=p->next;
}
st->next=p;
p=st;
}
问题2:就改了while这一段,让p一个个和st比,然后替换,为什么会出错,源程序为什么还要判断第一个不直接判断,还要多用一个q指针

f(p->score>st->score)
{st->next=p;//为什么我直接用st->next=p;head=st会不对!
p=st;;//为什么我直接用st->next=p;head=st会不对!
}
这样的话你就移动了head的地址,返回后不再指向链表头了.
while(p&&p->score<st->score)
{q=p;
p=p->next; 这句你可能写错了吧?应是p=q->next
}

加个头结点会比没有头结点的链表容易的多,我这么说你明白吧

这样的问题用冒泡排序是很不明智的,该为选择法排序会更简单,效率更高。

各个变量之间会进行值的传递
而且插入是处于动态循环进行的
你如果把写入HEAD=ST 就值固定了没进行传递 (个人见解)