user-0 提问: 这个程序老是异常，不能正常运行，大佬们帮我看看

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

user: user-0
content: 引用 4 楼 自信男孩的回复:#include<stdio.h> #include<stdlib.h> #include<stdbool.h>  typedef  struct LNode{ 	char data; 	struct LNode*  next; }LNode, *LinkList;  void CreateList_L(LinkList *L, int n );                //逆序构造链表  bool GetElem_L(LinkList L, int i, char* elem);        //查找链表的第i个元素   int main(char* argv[], int argc) { 	LinkList L = NULL;                        //定义了一个头结点的指针  	CreateList_L(&L,5);  	char* elem = (char *)malloc(sizeof(char));                        //用于返回第i个元素  	if (!elem) 		exit(0); 	//char elem; 	GetElem_L(L,3,elem); 	printf("链表的第3个元素是%c\n",*elem);   	return 0; }  //逆序构造链表,L->next永远指向NULL,L永远指向上一个结点  void CreateList_L(LinkList *L, int n ) { 	*L = (LinkList)malloc(sizeof(LNode)); 	(*L)->next = NULL; 	LinkList p = NULL;    //暂时指向NULL,用于申请结点  	for(int i = n; i>0; i--) 	{ 		p = (LinkList) malloc (sizeof(LNode)); 		if (!p) 			exit(0); 		scanf(" %c",&p->data); 		p->next = (*L)->next; 		(*L)->next = p;  	}  }   //查找链表中的第i个元素  bool GetElem_L(LinkList L, int i, char* elem){ 	LinkList q = L->next; 	int j = 1; 	while( q && j<i ){ 		q = q->next;                 //p指向下一个元素  		j++;  	} 	if( !q || j>i ) 		return false; 	else 		*elem = q->data; 	return true;  }  参考一下吧  两个地方都可能导致段错误： 1.创建链表时，因为形参定义的是一重指针，因此不能从创建函数里将新的链表节点带到main函数内。需要使用二重指针。另外一个办法，可以不改形参和实参，将哨兵节点的申请空间操作放在main函数内。 2. elem是指向NULL的指针，因此不能在GetElem_L函数内使用*elem = p->data；因为这样相当于*(NULL) = p->data;因此需要给elem申请空间，或者直接定义char变量，然后传递&elem进去 感谢大佬的耐心解答，并给出代码。 两点都指正的很好。 第一个因为按值传递确实应该传指针的地址进去； 第二点对NULL进行引用也确实不对，之前程序崩溃原因也应该在这吧。 再次感谢

user: user-0
content: 引用 1 楼 user-3的回复:你的CreateList_L函数的参数是按值传递的，也就是说主函数中的L和CreateList_L中的L是两个不同的变量，后者是前者复制得到的，你malloc申请的内存给了后者，但不会影响前者，也就是你主函数中的L仍然是个未初始的值，并没指向你申请到的内存，后面使用将导致你程序崩溃 感谢版主大佬解惑，是传递指针出了问题

user: user-2
content: #include<stdio.h> #include<stdlib.h> #include<stdbool.h>  typedef  struct LNode{ 	char data; 	struct LNode*  next; }LNode, *LinkList;  void CreateList_L(LinkList *L, int n );                //逆序构造链表  bool GetElem_L(LinkList L, int i, char* elem);        //查找链表的第i个元素   int main(char* argv[], int argc) { 	LinkList L = NULL;                        //定义了一个头结点的指针  	CreateList_L(&L,5);  	char* elem = (char *)malloc(sizeof(char));                        //用于返回第i个元素  	if (!elem) 		exit(0); 	//char elem; 	GetElem_L(L,3,elem); 	printf("链表的第3个元素是%c\n",*elem);   	return 0; }  //逆序构造链表,L->next永远指向NULL,L永远指向上一个结点  void CreateList_L(LinkList *L, int n ) { 	*L = (LinkList)malloc(sizeof(LNode)); 	(*L)->next = NULL; 	LinkList p = NULL;    //暂时指向NULL,用于申请结点  	for(int i = n; i>0; i--) 	{ 		p = (LinkList) malloc (sizeof(LNode)); 		if (!p) 			exit(0); 		scanf(" %c",&p->data); 		p->next = (*L)->next; 		(*L)->next = p;  	}  }   //查找链表中的第i个元素  bool GetElem_L(LinkList L, int i, char* elem){ 	LinkList q = L->next; 	int j = 1; 	while( q && j<i ){ 		q = q->next;                 //p指向下一个元素  		j++;  	} 	if( !q || j>i ) 		return false; 	else 		*elem = q->data; 	return true;  }  参考一下吧  两个地方都可能导致段错误： 1.创建链表时，因为形参定义的是一重指针，因此不能从创建函数里将新的链表节点带到main函数内。需要使用二重指针。另外一个办法，可以不改形参和实参，将哨兵节点的申请空间操作放在main函数内。 2. elem是指向NULL的指针，因此不能在GetElem_L函数内使用*elem = p->data；因为这样相当于*(NULL) = p->data;因此需要给elem申请空间，或者直接定义char变量，然后传递&elem进去

user: user-0
content: 在构造链表的函数中，L->next永远指向头结点。这个在备注里面写错了

user: user-3
content: 要解决这个问题，你函数参数要传递指针的地址，而不是指针本身

user: user-3
content: 你的CreateList_L函数的参数是按值传递的，也就是说主函数中的L和CreateList_L中的L是两个不同的变量，后者是前者复制得到的，你malloc申请的内存给了后者，但不会影响前者，也就是你主函数中的L仍然是个未初始的值，并没指向你申请到的内存，后面使用将导致你程序崩溃