user-0 提问: 链表赋值出错

回复:
user: user-0
content: NODE *insert_table(NODE *p,int index)						//添加元素 { 	NODE *pnew=(NODE *)malloc(sizeof(NODE)); 	if (NULL==pnew) 	{ 		printf("Out of space!\n"); 		return 0; 	} 	int n = 0; 	char buffer[64]={0}; 	while (scanf("%s",buffer)!= EOF) 	{ 		//int l1 = strlen(buffer); 		//pnew->arr[n] = (char *)malloc(sizeof(char)*(l1 + 1)); 		pnew->arr[n] = (char *)malloc(strlen(buffer) + 1); 		strcpy(pnew->arr[n],buffer); 		for (int i = 0; i <=n; i++) 		{ 			printf("arr[n]的值为%s",pnew->arr[i]); 		} 	 		if (n==index){ 			break; 		}else{ 			n++; 		} 	} 	pnew->next=p->next;		//新的节点的后继取代前节点的后继 	p->next=pnew;			//前节点指向自己 	return pnew; } 我在中间检测了赋值的问题，好像没错，那么是不是后面指针指向错了。。看了下感觉也没什么问题 pnew->next=p->next;		//新的节点的后继取代前节点的后继 	p->next=pnew;			//前节点指向自己 	return pnew;

user: user-0
content: 引用 2 楼 qq423399099 的回复:楼主贴一下NODE的结构体，那个arr是个啥类型的 #include <stdlib.h> #include <stdio.h> #include <string.h> #include<conio.h> #define NULL 0    #define amount1 100            //结构体中*arr[]数组长度，用来定义扩充成员个数  struct NODE { 	char *arr[amount1]; 	NODE *next;            //指向后继 };

user: user-1
content: 楼主贴一下NODE的结构体，那个arr是个啥类型的

user: user-2
content: 检查指针是否有效，数组是否越界

user: user-0
content: 错误补充_(:зゝ∠)_  0x010F32CB 处的第一机会异常(在 mysqltext.exe 中): 0xC0000005: 读取位置 0x00000190 时发生访问冲突。 线程 0x1938 已退出，返回值为 -1073741510 (0xc000013a)。 程序“[1680] mysqltext.exe”已退出，返回值为 -1073741510 (0xc000013a)。

user: user-0
content: 引用 10 楼 qq423399099 的回复:楼主你的create_table函数里 head头结点的next指针你没有赋值也没有赋成NULL（不知道指向哪了） 之后insert_table函数里while循环之后： pnew->next=p->next;   //报错，p->next指向的是一个未知区域 好的。。谢谢都懂了_(:зゝ∠)_

user: user-0
content: 引用 6 楼 jyxuan94 的回复:所有相关带买都贴下吧 头文件#include <stdlib.h> #include <stdio.h> #include <string.h> #include<conio.h> #define NULL 0    #define amount1 100            //结构体中*arr[]数组长度，用来定义扩充成员个数  struct NODE { 	char *arr[amount1]; 	NODE *next;            //指向后继 };  void help_list();																			//显示帮助文档  int create_table(NODE* head);																//建表，添加类名 NODE *insert_table(NODE *p,int n);												//添加元素  table.cpp文件 #include"table.h" int create_table(NODE* head) { 	head = (NODE *)malloc(sizeof(NODE)); 	int index = 0; 	char buffer[64] = {0}; 	while (scanf("%s",buffer)!= EOF)  	{ 		head->arr[index] = (char *)malloc(strlen(buffer) + 1); 		strcpy(head->arr[index],buffer); 		if(getchar() == '\n')break;//读到输入的字符串的末尾了，结束循环 		else index++; 	} 	return index; }  NODE *insert_table(NODE *p,int index)						//添加元素 { 	NODE *pnew=(NODE *)malloc(sizeof(NODE)); 	if (NULL==pnew) 	{ 		printf("Out of space!\n"); 		return 0; 	} 	int n = 0; 	char buffer[64]={0}; 	while (scanf("%s",buffer)!= EOF) 	{ 		pnew->arr[n] = (char *)malloc(sizeof(strlen(buffer) + 1)); 		strcpy(pnew->arr[n],buffer); 		for (int i = 0; i <=n; i++) 		{ 			printf("arr[n]的值为%s",pnew->arr[i]); 		}  		if (n==index){ 			break; 		}else{ 			n++; 		} 	} 	pnew->next=p->next;		//新的节点的后继取代前节点的后继 	p->next=pnew;			//前节点指向自己 	return pnew; } void insert_member(NODE* head,int add_n,int index)					//添加成员 { 	NODE *pnew =(NODE *)malloc(sizeof(NODE)); 	char buffer[64] = {0}; 	scanf("%s",buffer); 	head->arr[index] = (char *)malloc(strlen(buffer) + 1); 	strcpy(head->arr[index], buffer); 	pnew=head->next; 	for (int i = 0; i <= add_n; i++) 	{ 		scanf("%s",buffer); 		pnew->arr[index] = (char *)malloc(strlen(buffer) + 1); 		pnew=pnew->next; 	}	 } 主函数的cpp文件 #include"table.h" #define amount 100			//数组长度  NODE *head;  //判断开始命令是否正确 void right_wrong(char *p1) { 	char *p2,arr[amount]; 	p2=arr; 	while (1) 	{ 		gets(p2); 		if (strcmp(p1,p2)==0){ 			printf("how to use mysql?	please enter<help>\n>>mysql order>>"); 			break; 		} 		else { 			printf(">>error!\n Please enter<start mysql>\n"); 		} 	} } void main() { 	int index,add_n=1;						//index成员个数,add_n计数 	char *p0,arr[amount]; 	char create_name[300];					//文件保存名字 	NODE *p;								//用来标注链表的最后一个节点地址 	p=head; 	p0=arr;									//p0为输入的字符串，arr数组用来初始化*p0 	char p1[]="start mysql",p2[]="help",p3[]="create table",p4[]="table insert",			//功能命令 	printf(">>my sql!\n"); 	right_wrong(p1);  	//主程序运行过程，输入指令对应到相符的条件下调用函数实现功能 	while (1) 	{ 		gets(p0); 		if (strcmp(p2,p0)==0){											//显示帮助文档		 			printf(">>mysql order>>"); 		} 		else if (strcmp(p3,p0)==0){										//建表和结构体 			printf(">>Please enter the name of the table\n>>");			//保存文件名 			gets(create_name);													 			printf(">>Please enter the member of the table\n>>"); 			index=create_table(head); 			printf(">>success!enter %d memers!\n>>mysql order>>",index+1); 		} 		else if (strcmp(p4,p0)==0){										//元素添加 			printf(">>Please enter the element\n>>"); 			p=insert_table(p,index);									//p的地址变成新的节点 			printf(">>success!\n>>mysql order>>"); 		} 		else { 			printf(">>error!\n Please read the help file\n>>mysql order>>"); 		} 	} } #include <stdlib.h> #include <stdio.h> #include <string.h> #include<conio.h> #define NULL 0    #define amount1 100            //结构体中*arr[]数组长度，用来定义扩充成员个数 #define  amount 100    struct NODE { 	char *arr[amount1]; 	NODE *next;            //指向后继 };  NODE *head;  int create_table(NODE* head) { 	head = (NODE *)malloc(sizeof(NODE)); 	int index = 0; 	char buffer[64] = {0}; 	while (scanf("%s",buffer)!= EOF)  	{ 		head->arr[index] = (char *)malloc(strlen(buffer) + 1); 		strcpy(head->arr[index],buffer); 		if(getchar() == '\n')break;//读到输入的字符串的末尾了，结束循环 		else index++; 	} 	return index; }  NODE *insert_table(NODE *p,int index)						//添加元素 { 	NODE *pnew=(NODE *)malloc(sizeof(NODE)); 	if (NULL==pnew) 	{ 		printf("Out of space!\n"); 		return 0; 	} 	int n = 0; 	char buffer[64]={0}; 	while (scanf("%s",buffer)!= EOF) 	{ 		pnew->arr[n] = (char *)malloc(sizeof(strlen(buffer) + 1)); 		strcpy(pnew->arr[n],buffer); 		if (n==index){ 			break; 		}else{ 			n++; 		} 	} 	pnew->next=p->next;		//新的节点的后继取代前节点的后继 	p->next=pnew;			//前节点指向自己 	return pnew; } void main() {  	int index,add_n=1;						//index成员个数,add_n计数 	char create_name[300];					//文件保存名字 	NODE *p;								//用来标注链表的最后一个节点地址 	p=head; 	 										//建表和结构体												 	printf(">>Please enter the member of the table\n>>"); 	index=create_table(head); 	printf(">>success!enter %d memers!\n>>mysql order>>",index+1);  	printf(">>Please enter the element\n>>"); 	p=insert_table(p,index);									//p的地址变成新的节点 	printf(">>success!\n>>mysql order>>");		 	 } 大大上面的整理的有点乱。我现在把代码相关的部分拿出来放在一个源文件了

user: user-1
content: 楼主你的create_table函数里 head头结点的next指针你没有赋值也没有赋成NULL（不知道指向哪了） 之后insert_table函数里while循环之后： pnew->next=p->next;   //报错，p->next指向的是一个未知区域

user: user-0
content: 引用 7 楼 qq423399099 的回复:[quote=引用 4 楼 jyxuan94 的回复:] [quote=引用 2 楼 qq423399099 的回复:] 楼主贴一下NODE的结构体，那个arr是个啥类型的 #include <stdlib.h> #include <stdio.h> #include <string.h> #include<conio.h> #define NULL 0    #define amount1 100            //结构体中*arr[]数组长度，用来定义扩充成员个数  struct NODE { 	char *arr[amount1]; 	NODE *next;            //指向后继 };[/quote] strcpy那里应该是对的[/quote] pnew->next=p->next;        //新的节点的后继取代前节点的后继     p->next=pnew;            //前节点指向自己     return pnew; 这个应该也没问题吧

user: user-1
content: 引用 4 楼 jyxuan94 的回复:[quote=引用 2 楼 qq423399099 的回复:] 楼主贴一下NODE的结构体，那个arr是个啥类型的 #include <stdlib.h> #include <stdio.h> #include <string.h> #include<conio.h> #define NULL 0    #define amount1 100            //结构体中*arr[]数组长度，用来定义扩充成员个数  struct NODE { 	char *arr[amount1]; 	NODE *next;            //指向后继 };[/quote] strcpy那里应该是对的

user: user-0
content: 所有相关带买都贴下吧 头文件#include <stdlib.h> #include <stdio.h> #include <string.h> #include<conio.h> #define NULL 0    #define amount1 100            //结构体中*arr[]数组长度，用来定义扩充成员个数  struct NODE { 	char *arr[amount1]; 	NODE *next;            //指向后继 };  void help_list();																			//显示帮助文档  int create_table(NODE* head);																//建表，添加类名 NODE *insert_table(NODE *p,int n);												//添加元素  table.cpp文件 #include"table.h" int create_table(NODE* head) { 	head = (NODE *)malloc(sizeof(NODE)); 	int index = 0; 	char buffer[64] = {0}; 	while (scanf("%s",buffer)!= EOF)  	{ 		head->arr[index] = (char *)malloc(strlen(buffer) + 1); 		strcpy(head->arr[index],buffer); 		if(getchar() == '\n')break;//读到输入的字符串的末尾了，结束循环 		else index++; 	} 	return index; }  NODE *insert_table(NODE *p,int index)						//添加元素 { 	NODE *pnew=(NODE *)malloc(sizeof(NODE)); 	if (NULL==pnew) 	{ 		printf("Out of space!\n"); 		return 0; 	} 	int n = 0; 	char buffer[64]={0}; 	while (scanf("%s",buffer)!= EOF) 	{ 		pnew->arr[n] = (char *)malloc(sizeof(strlen(buffer) + 1)); 		strcpy(pnew->arr[n],buffer); 		for (int i = 0; i <=n; i++) 		{ 			printf("arr[n]的值为%s",pnew->arr[i]); 		}  		if (n==index){ 			break; 		}else{ 			n++; 		} 	} 	pnew->next=p->next;		//新的节点的后继取代前节点的后继 	p->next=pnew;			//前节点指向自己 	return pnew; } void insert_member(NODE* head,int add_n,int index)					//添加成员 { 	NODE *pnew =(NODE *)malloc(sizeof(NODE)); 	char buffer[64] = {0}; 	scanf("%s",buffer); 	head->arr[index] = (char *)malloc(strlen(buffer) + 1); 	strcpy(head->arr[index], buffer); 	pnew=head->next; 	for (int i = 0; i <= add_n; i++) 	{ 		scanf("%s",buffer); 		pnew->arr[index] = (char *)malloc(strlen(buffer) + 1); 		pnew=pnew->next; 	}	 } 主函数的cpp文件 #include"table.h" #define amount 100			//数组长度  NODE *head;  //判断开始命令是否正确 void right_wrong(char *p1) { 	char *p2,arr[amount]; 	p2=arr; 	while (1) 	{ 		gets(p2); 		if (strcmp(p1,p2)==0){ 			printf("how to use mysql?	please enter<help>\n>>mysql order>>"); 			break; 		} 		else { 			printf(">>error!\n Please enter<start mysql>\n"); 		} 	} } void main() { 	int index,add_n=1;						//index成员个数,add_n计数 	char *p0,arr[amount]; 	char create_name[300];					//文件保存名字 	NODE *p;								//用来标注链表的最后一个节点地址 	p=head; 	p0=arr;									//p0为输入的字符串，arr数组用来初始化*p0 	char p1[]="start mysql",p2[]="help",p3[]="create table",p4[]="table insert",			//功能命令 	printf(">>my sql!\n"); 	right_wrong(p1);  	//主程序运行过程，输入指令对应到相符的条件下调用函数实现功能 	while (1) 	{ 		gets(p0); 		if (strcmp(p2,p0)==0){											//显示帮助文档		 			printf(">>mysql order>>"); 		} 		else if (strcmp(p3,p0)==0){										//建表和结构体 			printf(">>Please enter the name of the table\n>>");			//保存文件名 			gets(create_name);													 			printf(">>Please enter the member of the table\n>>"); 			index=create_table(head); 			printf(">>success!enter %d memers!\n>>mysql order>>",index+1); 		} 		else if (strcmp(p4,p0)==0){										//元素添加 			printf(">>Please enter the element\n>>"); 			p=insert_table(p,index);									//p的地址变成新的节点 			printf(">>success!\n>>mysql order>>"); 		} 		else { 			printf(">>error!\n Please read the help file\n>>mysql order>>"); 		} 	} }