stu *insert_num(stu *head)
{
struct stu *head1,*p,*p1,*p2,*t;
head1=NULL;
t=head;
while(t!=NULL)
{
p=t;
p1=head1;
if (head1==NULL) head1=p;
else
{
while((p->num>p1->num)&&(p1->next!=NULL))
{
p2=p1;
p1=p1->next;
}
if(p->num<p1->num)
{
if(head1==p1) head1=p;
else p2->next=p;
p->next=p1;
}
else p1->next=p;
}
t=t->next;
}
return head1;
}
----------------解决方案--------------------------------------------------------
----------------解决方案--------------------------------------------------------
/*先发一个完整的(尚未调通:sorting死循环)*/
#include<stdio.h>
struct stu
{
int num;
struct stu* next;
};
struct stu *sorting(struct stu *head)
{
struct stu *head1,*p,*p1,*p2,*t;
head1=NULL;
t=head;
while(t!=NULL)
{
p=t;
p1=head1;
if(head1==NULL)
head1=p;
else
{
while((p->num>p1->num)&&(p1->next!=NULL))
{
p2=p1;
p1=p1->next;
}
if(p->num<p1->num)
{
if(head1==p1)
head1=p;
else
p2->next=p;
p->next=p1;
}
else
p1->next=p;
}
t=t->next;
}
return head1;
}
main()
{
struct stu ary[6]={
78,ary+1, 98,ary+2, 68,ary+3,
88,ary+4, 47,ary+5, 99,NULL };
struct stu *head=ary,*p;
p=head;
while(p!=NULL)
{
printf("%d\t",p->num);
p=p->next;
}
printf("\n");
p=sorting(head);
while(p!=NULL)
{
printf("%d\t",p->num);
p=p->next;
}
printf("\n");
}
----------------解决方案--------------------------------------------------------
真的吗?~!我这个不够好么?~!呵呵。。。看看先~!
----------------解决方案--------------------------------------------------------
恕我直言,楼主的方法可能是死路一条!
因为在编写调试过程中发生了下列困难
1。抓取老表的首结点作为新表的临时头结点(这无可厚非)
2。关键的困难在于“新表”head1根本不存在对应的独立的存储空间!
因而楼主的“排序”陷入死循环啦。
如果想继续讨论下去,建议楼主先写出伪代码(要足够细致)。也许您
写着写着就恍然大悟了。
ps:看来“流程图”不画还是不行呵!
----------------解决方案--------------------------------------------------------
啊~!这样啊~!头痛。。。什么叫伪代码哦。。呵呵~!
----------------解决方案--------------------------------------------------------
/*下面是为楼主的stu结构做成的链表进行排序的伪代码*/
/*用冒泡法进行排序,不改变链接,只交换结点数据*/
/*[注意]这是个偷懒的办法,未发挥出链表的优势*/
0。结构类型 stu 定义:
{ 数据num; 指针next; };
1。定义stu型数组ary[N],并初始化为静态链表
2。定义表头stu *head指向ary[0]
3。冒泡排序过程如下
⑴ 第i轮操作(i=1,2,3,...,N-1)
⑵ 第j次比较(j=1,2,3,...,N-i)与交换
⑶ 循环体:
比较ary[j-1].num与ary[j].num的大小
如果顺序不合要求,则对调这两个结点
中的数据;否则什么都不做。
4。返回head,如果需要的话。
----------------解决方案--------------------------------------------------------
/*用C语言具体实现上述伪代码如下*/
#include<stdio.h>
struct stu
{
int num;
struct stu* next;
};
struct stu *sorting(struct stu *head,int numbers)
{
int i,j;
int temp;
struct stu *p,*q;
for(i=1;i<=numbers-1;i++)
{
p=head;q=p->next;
for(j=1;j<=numbers-i;j++)
{
if(p->num > q->num)
{
temp=p->num;
p->num=q->num;
q->num=temp;
}
p=q;q=p->next;
}
}
return head;
}
main()
{
struct stu ary[6]={
78,ary+1, 98,ary+2, 68,ary+3,
88,ary+4, 47,ary+5, 99,NULL };
struct stu *head=ary,*p;
p=head;
while(p!=NULL)
{
printf("%d\t",p->num);
p=p->next;
}
printf("\n");
p=sorting(head, 6);
while(p!=NULL)
{
printf("%d\t",p->num);
p=p->next;
}
printf("\n");
}
----------------解决方案--------------------------------------------------------
哦~!这样啊~!呵呵~!高手哦~!其实冒泡我也想过,不过我的程序的链的结点个数是不确定的,如果要用冒泡的的话我就要在插入结点是加个计数器进去了~!不过这样的冒泡法说得也几清晰~!保存先。。呵呵~!
至于我的程序我用全局变量弄好了~!这样在输入数据的同时就可以建立2条不同的链表,这样就可以边插入边排序了~!而且又不用返回链表了~!
----------------解决方案--------------------------------------------------------
8楼的结构体初始化错误,
struct stu ary[6]={
78,ary+1, 98,ary+2, 68,ary+3,
88,ary+4, 47,ary+5, 99,NULL };
指针部分直接ary+i无法实现
----------------解决方案--------------------------------------------------------