user-0 提问: 单链表的创建和查找的问题

回复:
user: user-0
content: 引用 1 楼 adusuccessfully 的回复:楼主的创建链表时，最后加了一段打印测试，这样循环完毕就将*L置为空了，所以在调用查找函数时，就会有指针异常（为空）错误。谢谢，当局者迷。真的是这！

user: user-0
content: 引用 2 楼 yaojuntong77 的回复: #include ... // 需要的头文件  #define TRUE  1 #define FALSE 0 #define OK    1 #define ERROR 0 #define INFEASIBLE -1    typedef int KeyType; typedef int ElemType;  /*************单链表*************************/ typedef struct LNode{ 	ElemType       data; 	struct LNode  *next; } LNode, *LinkList;  int createLinkList(LinkList *L, int array[], int length) { 	int    i; 	LNode *p;   	*L = (LinkList) malloc(sizeof(LNode)); 	(*L)->next = NULL; 	 	// 9到1循环 	for (i=length; i>0; --i) 	{ 		// 生成新结点 		p = (LNode *) malloc(sizeof(LNode)); 		// 一一赋值  		p->data = array[i-1];   // array[8]到array[0]依次赋值  		//把p插入到表头，即从L后面第二个开始放入单链表  		p->next = (*L)->next;   // 先连起p的后指针next  		(*L)->next = p;         // 再把L->next赋值为p，也就是连起p的前指针       	} 	 	//打印测试（第一个结点没用到）  	*L = (*L)->next;  	while(*L) 	{ 		printf("elem test:%d\n",(*L)->data); 		*L = (*L)->next; 	} }  /************问题在这~***************/ int searchLinkList(LinkList L,KeyType key) { 	LNode  *searchP = L->next;          // 指向第二个结点 从这一句开始不能执行！ 	int  j = 1;                         // 计数器j 	while(searchP&&searchP->data!=key)  // 顺指针向后查找，直到p为空 	{ 		printf("遍历的当前结点的值为：%d",searchP->data); 		searchP = searchP->next; 		j++; 	} 	return j; }  int main(void) { 	ElemType  array[9] = {93, 23, 12, 66, 44, 11, 2, 102, 31}; 	int       findNum,  returnIndex; 	LinkList  LK;  	createLinkList(&LK, array, 9); 	printf("请输入要查找的值:"); 	scanf("%d",&findNum); 	returnIndex = searchLinkList(LK,findNum); 	printf("所查点的位置i为（表示没有）:%d\n", returnIndex); }   1、LINE34、35的赋值有问题； 2、LINE38-44导致链表指针指向了尾部空指针位置，返回时会获取到表尾而不是表头，故此时发现指向了NULL； 3、LINE50：为什么要从第二个开始？ 4、LINE51：计数的j为什么是从1开始？  首先谢谢你的回复。 1、        p->next = (*L)->next;   // 先连起p的后指针next          (*L)->next = p;         // 再把L->next赋值为p，也就是连起p的前指针 我自我感觉这里没错啊，后插法插入结点，只是表达上不一样。 函数参数是LinkList *，所以这里*L表示LinkList指针。因此这样调用(*L)->next; 而p在声明时是LNode *p（和LinkList p含义一样），所以是p->next； 这种写法是不是不太好让您误解了？ 2、这里确实是考虑欠周到，已改正，应该设一个新结点p遍历L单链表做打印； 3、因为第一个结点没用到。之前是把数组各个数依次作结点插入到第一个结点后面。所以在查询时也是从第二个结点开始； 我看书上也是空出了第一个结点，不太明白它的用意... 4、因为return回去的值是数字的序号，我希望是从1开始的所以这样写了，应该无大碍。  经过修正程序已经能够正确运行了，谢谢您还有大家。

user: user-1
content: （线性）动态链表的类型（借助标准库 malloc,free 进行内存管理），大致分两类 1）单向链表 简称单链表 ; 只有一个指向下一个节点的指针  next 2）双向链表 简称双链表  ;有前后两个方向的指针，prep,next分别指向前后两个节点。 每种链表，都可以有带 空头结点和不带空头节点的两种 每种链表，都可以实现循环链表 所以，可以有至少六种链表的实现。  带 空头结点 的链表，实现简单方便。  基本建表方法，有前插法，后插法 两种，前一种，最后的插入数据在最前，后一种按照插入顺序存放。

user: user-2
content: #include ... // 需要的头文件  #define TRUE  1 #define FALSE 0 #define OK    1 #define ERROR 0 #define INFEASIBLE -1    typedef int KeyType; typedef int ElemType;  /*************单链表*************************/ typedef struct LNode{ 	ElemType       data; 	struct LNode  *next; } LNode, *LinkList;  int createLinkList(LinkList *L, int array[], int length) { 	int    i; 	LNode *p;   	*L = (LinkList) malloc(sizeof(LNode)); 	(*L)->next = NULL; 	 	// 9到1循环 	for (i=length; i>0; --i) 	{ 		// 生成新结点 		p = (LNode *) malloc(sizeof(LNode)); 		// 一一赋值  		p->data = array[i-1];   // array[8]到array[0]依次赋值  		//把p插入到表头，即从L后面第二个开始放入单链表  		p->next = (*L)->next;   // 先连起p的后指针next  		(*L)->next = p;         // 再把L->next赋值为p，也就是连起p的前指针       	} 	 	//打印测试（第一个结点没用到）  	*L = (*L)->next;  	while(*L) 	{ 		printf("elem test:%d\n",(*L)->data); 		*L = (*L)->next; 	} }  /************问题在这~***************/ int searchLinkList(LinkList L,KeyType key) { 	LNode  *searchP = L->next;          // 指向第二个结点 从这一句开始不能执行！ 	int  j = 1;                         // 计数器j 	while(searchP&&searchP->data!=key)  // 顺指针向后查找，直到p为空 	{ 		printf("遍历的当前结点的值为：%d",searchP->data); 		searchP = searchP->next; 		j++; 	} 	return j; }  int main(void) { 	ElemType  array[9] = {93, 23, 12, 66, 44, 11, 2, 102, 31}; 	int       findNum,  returnIndex; 	LinkList  LK;  	createLinkList(&LK, array, 9); 	printf("请输入要查找的值:"); 	scanf("%d",&findNum); 	returnIndex = searchLinkList(LK,findNum); 	printf("所查点的位置i为（表示没有）:%d\n", returnIndex); }   1、LINE34、35的赋值有问题； 2、LINE38-44导致链表指针指向了尾部空指针位置，返回时会获取到表尾而不是表头，故此时发现指向了NULL； 3、LINE50：为什么要从第二个开始？ 4、LINE51：计数的j为什么是从1开始？

user: user-3
content: 楼主的创建链表时，最后加了一段打印测试，这样循环完毕就将*L置为空了，所以在调用查找函数时，就会有指针异常（为空）错误。