user-0 提问: 单聊表的逆置，感觉逻辑没有错误，程序执行到最后一步打印就会崩溃 真心求解

回复:
user: user-1
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。

user: user-1
content: 数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

user: user-2
content: 不要用局部变量指针作为函数出参

user: user-3
content: 我觉得是初始化的时候没有malloc销毁的时候却free了，发生异常。

user: user-4
content: 引用 3 楼 独孤由过 的回复:注意：原来逆置返回临时变量地址，位于栈中 在返回之后，栈中函数地址、参数，以及定义临时变量、调用函数地址出栈，要么立即清零所在栈，即地址被抹掉， 要么还在，但是接着调用SListPrint，又会入栈，把原来l2所在栈区覆盖  SList* reverse_1(SList *P) { 	//头插逆置 	assert(P->first != NULL); 	SList l2; 	SListInit(&l2); 	SListNode* cur = P->first; 	while (cur != NULL) 	{ 		SListPushFront(&l2, cur->data); 		cur = cur->next; 	} 	return &l2; }  如果要实现单向链表逆置，可以用辅助栈，没必要重新创建节点并复制数据 应该也可以直接返回SList，而不是SList*

user: user-4
content: 注意：原来逆置返回临时变量地址，位于栈中 在返回之后，栈中函数地址、参数，以及定义临时变量、调用函数地址出栈，要么立即清零所在栈，即地址被抹掉， 要么还在，但是接着调用SListPrint，又会入栈，把原来l2所在栈区覆盖  SList* reverse_1(SList *P) { 	//头插逆置 	assert(P->first != NULL); 	SList l2; 	SListInit(&l2); 	SListNode* cur = P->first; 	while (cur != NULL) 	{ 		SListPushFront(&l2, cur->data); 		cur = cur->next; 	} 	return &l2; }  如果要实现单向链表逆置，可以用辅助栈，没必要重新创建节点并复制数据

user: user-4
content: 改过之后  #pragma once typedef int SLDataType;  typedef struct SListNode { 	int data; 	struct SListNode* next; }SListNode;  typedef struct SList { 	struct SListNode* first; }SList;  //初始化&销毁 void SListInit(SList* list);  //销毁 void SListDestroy(SList* list);  //头插 void SListPushFront(SList* list, SLDataType data);  //头删 void SListPopFront(SList* list);  //打印 void SListPrint(SList* list);  //尾插 void SListPushBack(SList* list, SLDataType data);  //尾删 void SListPopBack(SList* list);  //查找 SListNode* SListFind(SList* list, SLDataType data);  //在pos位置的节点后插入元素 void SListInsertAfter(SListNode* pos, SLDataType data);  //删除pos位置后的第一个节点 void SListEraseAfter(SListNode* pos);  //删除遇到的指定的第一个节点 void SListRemove(SList* list, SLDataType data); //逆置 SListNode* reverse_1(SList *P);  #include <stdio.h> #include <assert.h> #include <stdlib.h>  //初始化 void SListInit(SList* list) { 	assert(list != NULL); 	list->first = NULL; }  //销毁 void SListDestroy(SList* list) { 	SListNode* next; 	SListNode* cur; 	for (cur = list->first; cur != NULL; cur = next) 	{ 		next = cur->next; 		free(cur); 	} 	list->first = NULL; }  //头插 void SListPushFront(SList* list, SLDataType data) { 	SListNode* node = (SListNode*)malloc(sizeof(SListNode)); 	assert(node); 	node->data = data; 	node->next = list->first; 	//更新头指针的指向； 	list->first = node; }  //头删 void SListPopFront(SList* list) { 	SListNode* old_first = list->first; 	assert(list); //有无链表 	assert(list->first != NULL); //有链表，链表里是否有元素， 								 //若链表为空，则删除失败 	list->first = list->first->next; 	free(old_first); }  //打印 void SListPrint(SList* list) { 	SListNode* cur; 	assert(list); 	for (cur = list->first; cur != NULL; cur = cur->next) 	{ 		printf("%d-->", cur->data); 	} 	printf("NULL\n"); }  //尾插 void SListPushBack(SList* list, SLDataType data) { 	SListNode* node = (SListNode*)malloc(sizeof(SListNode)); 	SListNode* lastone = list->first; 	assert(list != NULL); 	for (; lastone->next != NULL; lastone = lastone->next) 	{ 	} 	assert(node != NULL); 	node->data = data; 	node->next = lastone->next; 	lastone->next = node; }  //尾删 void SListPopBack(SList* list) { 	SListNode* cur; 	SListNode* m; 	assert(list != NULL); 	assert(list->first != NULL); 	if (list->first->next == NULL) 	{ 		//若链表为空，则尾删即为头删 		SListPopFront(list); 		return; 	} 	for (cur = list->first; cur->next->next != NULL; cur = cur->next) 	{ 	}//找到倒数第二个节点 	m = cur->next; 	cur->next = m->next; 	free(m); }  //查找 SListNode* SListFind(SList* list, SLDataType data) { 	SListNode* cur = list->first; 	for (; cur != NULL; cur = cur->next) 	{ 		if (cur->data == data) 		{ 			return cur; 		} 	} 	return NULL; }  //在pos位置的节点后插入元素 void SListInsertAfter(SListNode* pos, SLDataType data) { 	SListNode* node = (SListNode*)malloc(sizeof(SListNode)); 	assert(node != NULL); 	node->data = data; 	node->next = pos->next; 	pos->next = node; }  //删除pos位置后的第一个节点 void SListEraseAfter(SListNode* pos) { 	SListNode* node = pos->next->next; 	free(pos->next); 	pos->next = node; }  //删除遇到的指定的第一个节点 void SListRemove(SList* list, SLDataType data) { 	SListNode* prev = NULL; 	SListNode* cur = list->first; 	while (cur != NULL && cur->data != data) 	{ 		prev = cur; 		cur = cur->next; 	} 	//要删除的节点不存在 	if (cur == NULL) 	{ 		return; 	} 	//要删除的节点若就是第一个节点 	if (prev == NULL) 	{ 		//即头删 		SListPopFront(list); 		return; 	} 	prev->next = cur->next; 	free(cur); }  SListNode* reverse_1(SList *P) { 	//头插逆置 	assert(P->first != NULL); 	SList l2; 	SListInit(&l2); 	SListNode* cur = P->first; 	while (cur != NULL) 	{ 		SListPushFront(&l2, cur->data); 		cur = cur->next; 	} 	return l2.first; }  void test() { 	SList l1; 	SListInit(&l1); 	SListPushFront(&l1, 1); 	SListPushFront(&l1, 2); 	SListPushFront(&l1, 3); 	SListPushFront(&l1, 4); 	SListPrint(&l1);  	SList l2; 	l2.first = reverse_1(&l1); 	SListPrint(&l2); }  int main() { 	test(); 	system("pause"); 	return 0; }