user-0 提问: 创建单链表｜有几个语句看不懂，dalao帮忙解一下吧

回复:
user: user-1
content: 添加了两个函数，跟踪显示链表的变化情况，希望对你有帮助。   #include <stdio.h> #include <stdlib.h> #include <malloc.h>  typedef struct LNode { 	int data; 	struct LNode *next; } LNode;  //创建单链表，要返回头节点的指针 // 头指针h是空表头，后面的节点才存放值 LNode *CreateLink(LNode *h, int a[], int n) { 	int i; 	LNode *s, *t; 	h = (LNode *)malloc(sizeof(LNode)); 	h->next = NULL; 	t = h; 	for (i = 0; i < n; ++i) { 		s = (LNode *)malloc(sizeof(LNode)); 		s->data = a[i]; 		t->next = s; 		t = t->next; //（尾插法） 	} 	t->next = NULL; 	return h; }  // 跟踪显示链表状态，前半部分 void headTrace(LNode *h) { 	LNode *ta = h; 	while (ta->next != NULL) { 		printf("%d ==> ", ta->next->data); 		ta = ta->next; 	} 	printf("NULL\n Head <==\n"); }  //  跟踪显示链表状态，后半部分 void tailTrace(LNode *p) { 	LNode *tb = p; 	while (tb != NULL) { 		printf("%d ==> ", tb->data); 		tb = tb->next; 	} 	printf("NULL\n Tail <==\n\n"); }  // 排序，递增方式 void Sort(LNode *h) { 	LNode *p, *p1, *q, *pre; 	if (h->next != NULL) { 		p = h->next->next; 		h->next->next = NULL; 		headTrace(h); 		tailTrace(p); 		while (p != NULL) { 			pre = h; 			q = pre->next; //			headTrace(h); //			tailTrace(p); 			while ((q != NULL) && (q->data < p->data)) { 				pre = q; 				q = q->next; 				headTrace(h); 				tailTrace(p);                                 printf("= ==> Moved Backward = ==> Moved Backward = ==> Moved Backward = ==>\n\n"); 			} 			p1 = p->next; 			p->next = pre->next; 			pre->next = p; 			p = p1; 			headTrace(h); 			tailTrace(p);                         printf("^^ Exchanged ^^ Exchanged ^^ Exchanged ^^ Exchanged ^^\n\n"); 		} 	} }  int main(int argc, char *argv[]) { 	struct LNode *h = NULL; 	int a[7] = { 49, 38, 65, 97, 76, 13, 27 }; 	h = CreateLink(h, a, 7); 	Sort(h); 	while (h->next != NULL) { 		printf("%d ", h->next->data); 		h = h->next; 	} 	return 0; }   结果部分截图，

user: user-1
content: 把代码里的错误，改了一下，主要是CreateLink函数需要有一个返回值，也就是头节点的指针，同时也在main函数里接受一下返回值。   #include <stdio.h> #include <stdlib.h> #include <malloc.h>  typedef struct LNode { 	int data; 	struct LNode *next; } LNode;  //创建单链表，要返回头节点的指针 // 头指针h是空表头，后面的节点才存放值 LNode *CreateLink(LNode *h, int a[], int n) { 	int i; 	LNode *s, *t; 	h = (LNode *)malloc(sizeof(LNode)); 	h->next = NULL; 	t = h; 	for (i = 0; i < n; ++i) { 		s = (LNode *)malloc(sizeof(LNode)); 		s->data = a[i]; 		t->next = s; 		t = t->next; //（尾插法） 	} 	t->next = NULL; 	return h; }  // 排序，递增方式 void Sort(LNode *h) { 	LNode *p, *p1, *q, *pre; 	if (h->next != NULL) { 		p = h->next->next; 		h->next->next = NULL; 		while (p != NULL) { 			pre = h; 			q = pre->next; 			while ((q != NULL) && (q->data < p->data)) { 				pre = q; 				q = q->next; 			} 			p1 = p->next; 			p->next = pre->next; 			pre->next = p; 			p = p1; 		} 	} }  int main(int argc, char *argv[]) { 	struct LNode *h = NULL; 	int a[7] = { 49, 38, 65, 97, 76, 13, 27 }; 	h = CreateLink(h, a, 7); 	Sort(h); 	while (h->next != NULL) { 		printf("%d ", h->next->data); 		h = h->next; 	} 	return 0; }   排序函数void Sort(LNode *h)中的  h->next->next = NULL;  要和后面的具体的排序语句结合起来看。  后面排序的条件是，（1）只要从头向后遍历的节点不是NULL，且前节点的 data 小于 后面某节点的 data，那么前节点就要后移一次，（2）前节点的 data 大于 后面某节点的 data ，那么这两个节点位置互换，（3）后节点一开始也只是前节点的后面一个节点而已，也要一次一次地向后移动。  所以，就会出现一个问题：当前节点 追上 后节点的时候，并且 前节点的 data 是 小于 后节点的 data 的情况下，怎么办？   假如 前节点 再向后移动一次的话，那就和 后节点 重合了， 二者的 data 是一样的， 那肯定不满足 前者 小于 后者 的条件， 那就 交换节点 位置吗？ 这就乱套了啊！   所以， 为了避免这种情况，就让 前节点 追上 后节点 的时候， 前节点的 next 指向 NULL ， 那么这个时候就是 第 2 层 的while 的条件   q != NULL    为假的时候，于是就让 后节点的指针 向后 移动 一次，并且 让 后节点 和 NULL 交换位置 ， 这样做就解决上面说的问题了。 这样， 前节点 、 后节点 的 data 的 比较、互换位置 、追赶，就都完成了。  不知道有没有描述情况，如果没看明白的话，建议你在纸上画一个简单的链表示意，一步一步地推导排序的变化过程，那样会更直观一点。  为了避免回答太长，在下面重新回复一个添加了跟踪显示链表状态的代码，请查看。

user: user-2
content: 这个代码错误太多了。建议你先检查下你抄的代码是否跟题目一致。

user: user-0
content: void sort（LNode*h）函数中 h－＞next－＞next＝NULL； （什么意思啊，为什么要这样写?）