C语言:单链表排序 有三个单链表程序 想知道每句运行下的意思(算法)

三个编译程序,分别是:直接选择排序;有序插入;归并两个单链表
想知道每一句程序运行下的指示是什么(算法/意思)
程序如下:

1直接选择排序:
Linklist * inserSort(Linklist *L) /*直接选择排序*/
{
Linklist *p=L->next;
Linklist *r;
Linklist *q;
int i;
int j;
int x;
int n=lengList(L);
for(i=1;i<n;i++)
{
q=p->next;
for(j=i+1;j<=n;j++)
{
if(p->data>q->data)
{
x=p->data;
p->data=q->data;
q->data=x;
}
q=q->next;
}
p=p->next;
}
return L;
}

2有序插入一个值
void Insertlist(Linklist *L,int x) /*有序插入一个值*/
{
Linklist *p,*r;
r=(Linklist *)malloc(sizeof(Linklist));
r->data=x;
p=L;
while((p->next)&&(p->next->data<x))
p=p->next;
r->next=p->next; p->next=r;
}

3归并俩个单链表
Linklist *Merge(Linklist *L1,Linklist *L2) /*归并俩个单链表*/
{
Linklist *L, *p,*q,*s,*r;
p=L1->next;
q=L2->next;
L=L1;
r=L;
while (p&&q)
{
if (p->data<=q->data)
{
s=p;
p=p->next;
}
else
{
s=q;
q=q->next;
}
r->next=s;
r=s;
}
if (q)
r->next=q;
else
r->next=p;
return L;
}

十分感谢!

1:Linklist * inserSort(Linklist *L) /*函数参数是一个链表的指针L,返回的也是这个指针,是排序好了的链表。*/
2:{
3: Linklist *p=L->next;/*p指向链表第一个节点。*/
4: Linklist *r;
5: Linklist *q;
6: int i;
7: int j;
8: int x;
9: int n=lengList(L);/*获取链表的节点总个数,存入n。*/
10: for(i=1;i<n;i++)/*这个for循环配合23行,让p依次指向链表的第1个节点到倒数第2个节点。
这显而易见啊:循环了n-1次,每次都执行23行“p=p->next”。*/
11: {
12: q=p->next;/*让q指向p的下一个节点*/
13: for(j=i+1;j<=n;j++)/*12行、这行的for循环和21行,让q依次指向p之后的节点一直到链表末尾。*/
14: {
15: if(p->data>q->data) /*看p中的数据是否比q中的大*/
16: {
17: x=p->data; /*这17,18,19三行是交换pq两节点的数据*/
18: p->data=q->data; /**/
19: q->data=x; /**/
20: }
21: q=q->next;
22: }
23: p=p->next;
24: }
25: return L;
26:}

以下是上面解释的动态例子:括号中是链表节点的数据,共4个节点,用1234标明。
1(5)->2(8)->3(2)->4(7)
i=1时:p->1(5)
j=2时:
p->1(5),q->2(8),if不成立,q->3(2)
j=3时:
p->1(5),q->3(2),if成立,交换,链表为1(2)->2(8)->3(5)->4(7),q->4(7)
j=4时:
p->1(2),q->4(7),if不成立q->5(null)
i=2时: p->2(8)
j=3时:
p->2(8),q->3(5),if成立,交换,链表为1(2)->2(5)->3(8)->4(7),q->4(7)
j=4时:
p->2(5),q->4(7),if不成立,q->5(null)
i=3时:p->3(8)
j=4时:
p->3(8),q->4(7),if成立,交换,链表为1(2)->2(5)->3(7)->4(8),q->5(null)
至此,排序流程走完,链表从5827排成了2578。

很不好意思,笔者由于重重原因现在仅能完成第一部分,希望能帮上你。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-01-05
代码就不对 没法解释本回答被网友采纳
相似回答