user-0 提问: free(p)弹出错误的对话框,求高手帮忙

回复:
user: user-1
content: 参考一下吧： //将c:\\tmp文件夹下的所有文件的内容全部放到用malloc分配的内存中 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <io.h> struct FB {     char fn[256];     size_t fl;     char *b;     struct FB *next;     struct FB *prev; } *fh,*fb,*ft; char ln[256]; char fpn[256]; FILE *af; FILE *f; int L,n; int main() {     system("dir /b /a-d c:\\tmp\\*.* >c:\\allfn.txt");     af=fopen("c:\\allfn.txt","r");     if (NULL==af) {         printf("Can not open file c:\\allfn.txt!\n");         return 1;     }     fh=NULL;     fb=NULL;     n=0;     while (1) {         if (NULL==fgets(ln,256,af)) break;         L=strlen(ln);         if ('\n'==ln[L-1]) ln[L-1]=0;         printf("read %s\n",ln);         strcpy(fpn,"c:\\tmp\\");         strcat(fpn,ln);         ft=(struct FB *)malloc(sizeof(struct FB));         if (NULL==ft) {             printf("Can not malloc ft!\n");             fclose(af);             return 2;//之前的malloc在main退出后由操作系统自动free         }         printf("ft[%d]==%p\n",n,ft);         strcpy(ft->fn,fpn);         f=fopen(fpn,"rb");         if (NULL==f) {             printf("Can not open file %s!\n",fpn);             fclose(af);             return 3;//之前的malloc在main退出后由操作系统自动free         }         ft->fl=_filelength(fileno(f));         ft->b=malloc(ft->fl);         if (NULL==ft->b) {             printf("Can not malloc ft->b!\n");             fclose(f);             fclose(af);             return 4;//之前的malloc在main退出后由操作系统自动free         }         printf("ft[%d]->b==%p\n",n,ft->b);         if (ft->fl!=fread(ft->b,1,ft->fl,f)) {             printf("fread error!\n");             fclose(f);             fclose(af);             return 5;//之前的malloc在main退出后由操作系统自动free         }         fclose(f);         ft->next=NULL;          if (NULL==fh) {             ft->prev=NULL;             fh=ft;         } else {             fb->next=ft;             ft->prev=fb;         }         fb=ft;         n++;     }     fclose(af);     printf("-----list-----\n");     for (ft=fh;NULL!=ft;ft=ft->next) {         printf("%8d %s\n",ft->fl,ft->fn);         if (NULL!=ft) fb=ft;     }     printf("-----free-----\n");     n--;     if (NULL!=fh) {         for (ft=fb->prev;NULL!=ft;ft=ft->prev) {             if (NULL!=ft->next->b) {                 printf("ft[%d]->b==%p\n",n,ft->next->b);                 free(ft->next->b);             }             if (NULL!=ft->next) {                 printf("ft[%d]==%p\n",n,ft->next);                 free(ft->next);             }             n--;         }         if (NULL!=fh->b) {             printf("ft[0]->b==%p\n",fh->b);             free(fh->b);         }         printf("ft[0]==%p\n",fh);         free(fh);     }     return 0; } //C:\tmp\tmp\Debug>dir /a-d c:\tmp // 驱动器 C 中的卷是 C_HD5_1 // 卷的序列号是 1817-D526 // // c:\tmp 的目录 // //找不到文件 // //C:\tmp\tmp\Debug>tmp //找不到文件 //-----list----- //-----free----- // //C:\tmp\tmp\Debug>dir /a-d c:\tmp // 驱动器 C 中的卷是 C_HD5_1 // 卷的序列号是 1817-D526 // // c:\tmp 的目录 // //2011-06-30  18:04            44,840 my_c.rar //2011-06-30  17:18             1,036 err.frm //2011-06-30  14:32            14,243 出租.txt //2011-06-28  12:08            23,681 MSDN98书签.txt //             4 个文件         83,800 字节 //             0 个目录 17,041,870,848 可用字节 // //C:\tmp\tmp\Debug>tmp //read my_c.rar //ft[0]==00421800 //ft[0]->b==00520068 //read err.frm //ft[1]==00421670 //ft[1]->b==0052AFC0 //read 出租.txt //ft[2]==00421530 //ft[2]->b==00378F28 //read MSDN98书签.txt //ft[3]==004213F0 //ft[3]->b==0052B3F8 //-----list----- // 44840 c:\tmp\my_c.rar //  1036 c:\tmp\err.frm // 14243 c:\tmp\出租.txt // 23681 c:\tmp\MSDN98书签.txt //-----free----- //ft[3]->b==0052B3F8 //ft[3]==004213F0 //ft[2]->b==00378F28 //ft[2]==00421530 //ft[1]->b==0052AFC0 //ft[1]==00421670 //ft[0]->b==00520068 //ft[0]==00421800 // //C:\tmp\tmp\Debug>

user: user-2
content: 自己写的代码只有自己最懂。。。 原来帮同学改代码感觉最头痛，因为不知道他是啥思想才能写出那么蛋疼的代码来的。。。

user: user-3
content: 最怕看这种没有格式化的代码

user: user-0
content: # include <stdio.h>  # include <malloc.h>  # include <stdlib.h>    typedef struct Node  {  	int data;  	struct Node * pNext; }NODE, *PNODE;  PNODE create_list(void);//生成链表  void traverse(PNODE);//遍历链表  int lenth_list(PNODE);//求链表的长度  bool empty_list(PNODE);//判断链表是否为空  void evacuate_list(PNODE);//清除线性表L中的所有元素，即释放单链表L中所有的结点，使之成为一个空表  void back_value_list(PNODE, int);//输出单链表中第pos个结点中的元素，若pos超出范围，提示输出值不存在  int * back_pdata_list(PNODE, int); //从单链表中查找具有给定值x的第一个元素，若查找成功则返回该结点data域的存储地址，否则返回NULL  bool revise_value_list(PNODE, int, int);//把单链表中第pos个结点的值修改为x的值，若修改成功返回 true，否则返回 false  void insert_list(PNODE, int);//向单链表的表头插入一个元素val  void add_list(PNODE, int);//向单链表的末尾添加一个元素val  bool insert_pos_list(PNODE, int, int);//向单链表中第pos个结点位置插入元素为x的结点，若插入成功返回true，否则返回false  int delpHead(PNODE pHead);//删除表头值,并返回,如果失败,中止程序~!  int main(void)  {  	PNODE pHead = NULL;  	pHead = create_list();  //	traverse(pHead); 	// if ( empty_list(pHead) )  	// printf("链表为空!\n");  	// else   	// printf("非空\n");  	// evacuate_list(pHead);//清空链表  	// printf("链表的长度为:%d\n", lenth_list(pHead) );  	// back_value_list(pHead,4);//输出头指针pHead的线性表中的第4个节点中的值  	//int * s = back_pdata_list(pHead,8);  	// printf("%p \n",s);  	// revise_value_list(pHead, 5, 88); 	//printf("将第5个节点的值改为88\n新的线性表为:\n");  	// insert_list(pHead,99);//表头插入  	// add_list(pHead, 888);//表尾追加  //	traverse(pHead);  	insert_pos_list(pHead, 1,9999);  //	traverse(pHead);  	int val = delpHead(pHead);  	printf("表头值为: %d\n", val);  	traverse(pHead); 	return 0;  }    //初始化链表  PNODE create_list(void)  {  	int len,i,val;  	printf("请输入您要生成的链表的长度:len = "); 	scanf("%d", &len);  	PNODE pHead = (PNODE)malloc(sizeof(NODE));  	if ( NULL == pHead )  	{  		printf("内存分配失败!\n");  		exit(-1);  	}  	PNODE pt = pHead;  	pt->pNext = NULL;   	for (i=0; i<len; i++)  	{  		PNODE pNew = (PNODE)malloc(sizeof(NODE));  		if ( NULL == pNew )  		{  			printf("内存分配失败!\n");  			exit(-1);  		}  		printf("请输入第%d个节点的值!", i+1);  		scanf("%d", &(pNew->data) );    		pt->pNext = pNew;  		pt = pNew;  		pt->pNext = NULL;  	}     	return pHead;  }      void traverse(PNODE pHead)  {  	PNODE p = pHead;  	while (NULL != p->pNext)  	{  		p = p->pNext;  		printf("%d ",p->data); 	}  	printf("\n");  	return;  }    //链表的长度  int lenth_list(PNODE pHead)  {  	int n=0;  	PNODE p = pHead;  	while (NULL != p->pNext) 	{  		p = p->pNext;  		n++;  	}  	return n;  }    //判断链表是否为空  bool empty_list(PNODE pHead) {  	if ( NULL == pHead->pNext)  		return true; 	else 		return false;  }    //清空链表  void evacuate_list(PNODE pHead)  {  	if (NULL == pHead->pNext)  		return;  	else  	{  		PNODE p = pHead->pNext;  		PNODE q;  		printf("%p", p->pNext);  		while (NULL != p->pNext)  		{  			q = p->pNext;  			free(p);  			p = q;  		}  		free(p);  		pHead->pNext = NULL;  	}  	return;  }      //返回单链表中第pos个结点中的元素，若pos超出范围，则返回flase  void back_value_list(PNODE pHead,int pos)  {  	int i = 1;  	PNODE p = pHead; 	while ( p->pNext != NULL && i <= pos )  	{  		p = p->pNext;  		i++;  	}  	if ( p != pHead )  		printf("第%d个值为:%d\n", pos, p->data);  	else 		printf("返回值不存在,中止程序!\n");  }      int * back_pdata_list(PNODE pHead,int val) //从单链表中查找具有给定值x的第一个元素，若查找成功则返回该结点data域的存储地址，否则返回NULL  {  	PNODE p = pHead;  	while (p->pNext != NULL && (p->pNext)->data != val)  	{  		p=p->pNext;  	}  	if (NULL == p->pNext) return NULL;  	else 		return &((p->pNext)->data);  }    //把单链表中第pos个结点的值修改为val的值，若修改成功返回 true，否则返回 false  bool revise_value_list(PNODE pHead,int pos,int val)  { 	PNODE p = pHead;  	int i=1;  	while (NULL != p->pNext && i<=pos)  	{  		p = p->pNext;  		i++;  	}   	if ( i-1 == pos)  	{  		p->data = val;  		return true;  	}  	else 		return false;  }    //向单链表的表头插入一个元素val  void insert_list(PNODE pHead,int val)  {  	PNODE pNew = (PNODE)malloc(sizeof(NODE));  	if (NULL == pNew)  	{  		printf("内存分配失败!\n");  		exit(-1);  	}  	pNew->data = val;  	pNew->pNext = NULL;  	if ( empty_list(pHead) )  		pHead->pNext = pNew;  	else 	{  		PNODE q = pHead->pNext;  		pHead->pNext = pNew;  		pNew->pNext = q;  	}  	return;  }    //向单链表的末尾添加一个元素val  void add_list(PNODE pHead, int val)  {  	PNODE p = pHead;  	while (NULL != p->pNext)  	{  		p = p->pNext;  	}  	PNODE pNew = (PNODE)malloc(sizeof(NODE));  	pNew->data = val;  	pNew->pNext = NULL;  	p->pNext = pNew;  }    //向单链表中第pos个结点位置前插入元素为val的结点，若插入成功返回true，否则返回false  bool insert_pos_list(PNODE pHead, int pos, int val)  {  	int i=1;  	PNODE p = pHead;  	while ( NULL != p->pNext && i<pos )  	{  		p = p->pNext;  		i++;  	} 	//将p的指向,移动到pos项的前一项  	if ( NULL == p->pNext || pos <i )  		return false;  	else 	{    //问题出在这了,PNODE pNew = (PNODE)malloc  (sizeof(PNODE));   		PNODE pNew = (PNODE)malloc(sizeof(NODE));  if ( NULL == pNew )  		{  			printf("内存分配失败!\n");  			exit(-1);  		}  		pNew->data = val;  		pNew->pNext = p->pNext;  		p->pNext = pNew;  	}  	return true;  }      //从单链表中删除表头结点，并把该结点的值返回，若删除失败则停止程序运行  int delpHead(PNODE pHead)  {  	PNODE p = NULL;  	int val;  	if ( NULL == pHead->pNext )  	{  		exit(-1);  	}  	else 	{  		p = pHead->pNext;  		val = p->data;  		pHead->pNext = p->pNext;  		free(p);//该行不注释就出错!!求解...  		p = NULL;  		return val;  	}   }  我现在想问的是: PNODE pNew = (PNODE)malloc(sizeof(PNODE)); 此语句怎么会不报错误,并且后面的 pNew->data   pNew->pNext都能用    但是  另外一个函数 free(p)才出错...望高手讲解...

user: user-4
content: 引用 15 楼 yiyefangzhou24 的回复:[quote=引用 14 楼 sadadi 的回复:] free(p) p=NULL 改 p=NULL free(p) 这个有问题，p指向空了，还free他干嘛 [/quote] 我想说的是 你没初始化...

user: user-5
content: 指针的问题，自己用debugger跟踪一遍，没有什么比这个更好。

user: user-6
content: 我擦.你这样.幸亏好人多愿意帮你看.  free()报错 . 要么free多次一个地址.  要么你进行了指针运算 如p++导致内存越界.一般就这样.

user: user-1
content: 仅供参考//假设带表头结点的单向链表头指针为head，试编写一个算法将值为5的结点插入到连接表的第k个结点前，删除第k个节点，并对该链表进行排序。 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <time.h> struct NODE {     int          data;     struct NODE *next; } H,*head,*p,*q,*s1,*s2,*s3,*s4,*s; int i,j,k,n,t,m; int main() {     srand(time(NULL));      //填写头节点数据     H.data=-1;     H.next=NULL;     head=&H;      //创建10个节点的单链表     p=head;     for (i=0;i<10;i++) {         q=(struct NODE *)malloc(sizeof(struct NODE));         if (NULL==q) return 1;         q->data=rand()%100;//填写0..99的随机值         q->next=NULL;         p->next=q;         p=q;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //将值为5的结点插入到单链表的第k个结点前     k=3;     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==n) {             q=(struct NODE *)malloc(sizeof(struct NODE));             if (NULL==q) return 1;             q->data=5;             q->next=p->next;             p->next=q;             break;         }         p=p->next;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //删除第k个节点     k=5;     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==n) {             q=p->next;             if (q) {                 p->next=q->next;                 free(q);             }             break;         }         p=p->next;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //从小到大排序     for (p=head;p!=NULL && p->next!=NULL;p=p->next) {         for (q=p->next;q!=NULL && q->next!=NULL;q=q->next) {             if (p->next->data > q->next->data) {                  //交换data //              printf("swap %02d %02d\n",p->next->data,q->next->data); //              t=p->next->data;p->next->data=q->next->data;q->next->data=t;                  //或者                  //交换next //              printf("swap %02d %02d\n",p->next->data,q->next->data);                 s1=p->next;                 s2=p->next->next;                 s3=q->next;                 s4=q->next->next;                  if (s2!=s3) {                      p->next=s3;                     s3->next=s2;                      q->next=s1;                     s1->next=s4;                 } else {                      p->next=s3;                     s3->next=s1;                            q=s3;                     s1->next=s4;                 }                  //输出整个单链表 //              s=head->next; //              while (1) { //                  if (NULL==s) { //                      printf("\n"); //                      break; //                  } //                  printf("%02d->",s->data); //                  s=s->next; //              } //              getchar();             }         }     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //将单链表中前 m 个结点和后 n 个结点进行互换,m+n为链表总长10     m=4;     n=6;     k=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         k++;         if (m+1==k) {             q=p;         }         s=p;         p=p->next;     }     s1=head->next;     head->next=q->next;     s->next=s1;     q->next=NULL;      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //释放所有节点     p=head->next;     while (1) {         if (NULL==p) {             break;         }         q=p->next;         free(p);         p=q;     }      return 0; } //18->94->58->17->27->20->43->57->75->78-> //18->94->05->58->17->27->20->43->57->75->78-> //18->94->05->58->27->20->43->57->75->78-> //05->18->20->27->43->57->58->75->78->94-> //43->57->58->75->78->94->05->18->20->27-> //

user: user-0
content: 引用 15 楼 yiyefangzhou24 的回复:[quote=引用 14 楼 sadadi 的回复:] free(p) p=NULL 改 p=NULL free(p) 这个有问题，p指向空了，还free他干嘛 [/quote] 你说P的引用越界了,是什么意思,我还是没弄明白.至于14楼,就没必要去深究了..

user: user-4
content: free(p) p=NULL 改 p=NULL free(p)

user: user-7
content: //这个是代码  //代码好长啊

user: user-8
content: 这种情况一般是你对p的引用越界了

user: user-0
content: 引用 10 楼 buyong 的回复:[quote=引用 7 楼 qq597955169 的回复:] # include <stdio.h> # include <malloc.h> # include <stdlib.h>  typedef struct Node { int data; struct Node * pNext; }NODE, *PNODE; PNODE create_list(void);//生成链表 void traverse(PNODE);//遍历链表 int lenth_list(PNODE);//求链表的长度 bool empty_list(PNODE);//判断链表是否为空 void evacuate_list(PNODE);//清除线性表L中的所有元素，即释放单链表L中所有的结点，使之成为一个空表 void back_value_list(PNODE, int);//输出单链表中第pos个结点中的元素，若pos超出范围，提示输出值不存在 int * back_pdata_list(PNODE, int); //从单链表中查找具有给定值x的第一个元素，若查找成功则返回该结点data域的存储地址，否则返回NULL bool revise_value_list(PNODE, int, int);//把单链表中第pos个结点的值修改为x的值，若修改成功返回 true，否则返回 false void insert_list(PNODE, int);//向单链表的表头插入一个元素val void add_list(PNODE, int);//向单链表的末尾添加一个元素val bool insert_pos_list(PNODE, int, int);//向单链表中第pos个结点位置插入元素为x的结点，若插入成功返回true，否则返回false int delpHead(PNODE pHead);//删除表头值,并返回,如果失败,中止程序~! int main(void) { PNODE pHead = NULL; pHead = create_list(); traverse(pHead);  // if ( empty_list(pHead) ) // printf("链表为空!\n"); // else  // printf("非空\n"); // evacuate_list(pHead);//清空链表 // printf("链表的长度为:%d\n", lenth_list(pHead) ); // back_value_list(pHead,4);//输出头指针pHead的线性表中的第4个节点中的值 //int * s = back_pdata_list(pHead,8); // printf("%p \n",s); // revise_value_list(pHead, 5, 88);//printf("将第5个节点的值改为88\n新的线性表为:\n"); // insert_list(pHead,99);//表头插入 // add_list(pHead, 888);//表尾追加 traverse(pHead); insert_pos_list(pHead, 1,9999); traverse(pHead); int val = delpHead(pHead); printf("表头值为: %d\n", val); return 0; }  //初始化链表 PNODE create_list(void) { int len,i,val; printf("请输入您要生成的链表的长度:len = "); scanf("%d", &len); PNODE pHead = (PNODE)malloc(sizeof(NODE)); if ( NULL == pHead ) { printf("内存分配失败!\n"); exit(-1); } PNODE pt = pHead; pt->pNext = NULL;  for (i=0; i<len; i++) { PNODE pNew = (PNODE)malloc(sizeof(NODE)); if ( NULL == pNew ) { printf("内存分配失败!\n"); exit(-1); } printf("请输入第%d个节点的值!", i+1); scanf("%d", &(pNew->data) );  pt->pNext = pNew; pt = pNew; pt->pNext = NULL; }   return pHead; }   void traverse(PNODE pHead) { PNODE p = pHead; while (NULL != p->pNext) { p = p->pNext; printf("%d ",p->data);  } printf("\n"); return; }  //链表的长度 int lenth_list(PNODE pHead) { int n=0; PNODE p = pHead; while (NULL != p->pNext) { p = p->pNext; n++; } return n; }  //判断链表是否为空 bool empty_list(PNODE pHead) { if ( NULL == pHead->pNext) return true; else return false; }  //清空链表 void evacuate_list(PNODE pHead) { if (NULL == pHead->pNext) return; else  { PNODE p = pHead->pNext; PNODE q; printf("%p", p->pNext); while (NULL != p->pNext) { q = p->pNext; free(p); p = q; } free(p); pHead->pNext = NULL; } return; }   //返回单链表中第pos个结点中的元素，若pos超出范围，则返回flase void back_value_list(PNODE pHead,int pos) { int i = 1; PNODE p = pHead; while ( p->pNext != NULL && i <= pos ) { p = p->pNext; i++; } if ( p != pHead ) printf("第%d个值为:%d\n", pos, p->data); else printf("返回值不存在,中止程序!\n"); }   int * back_pdata_list(PNODE pHead,int val)//从单链表中查找具有给定值x的第一个元素，若查找成功则返回该结点data域的存储地址，否则返回NULL { PNODE p = pHead; while (p->pNext != NULL && (p->pNext)->data != val) { p=p->pNext; } if (NULL == p->pNext) return NULL; else return &((p->pNext)->data); }  //把单链表中第pos个结点的值修改为val的值，若修改成功返回 true，否则返回 false bool revise_value_list(PNODE pHead,int pos,int val) { PNODE p = pHead; int i=1; while (NULL != p->pNext && i<=pos) { p = p->pNext; i++; }  if ( i-1 == pos) { p->data = val; return true; } else return false; }  //向单链表的表头插入一个元素val void insert_list(PNODE pHead,int val) { PNODE pNew = (PNODE)malloc(sizeof(NODE)); if (NULL == pNew) { printf("内存分配失败!\n"); exit(-1); } pNew->data = val; pNew->pNext = NULL; if ( empty_list(pHead) ) pHead->pNext = pNew; else { PNODE q = pHead->pNext; pHead->pNext = pNew; pNew->pNext = q; } return; }  //向单链表的末尾添加一个元素val void add_list(PNODE pHead, int val) { PNODE p = pHead; while (NULL != p->pNext) { p = p->pNext; } PNODE pNew = (PNODE)malloc(sizeof(NODE)); pNew->data = val; pNew->pNext = NULL; p->pNext = pNew; }  //向单链表中第pos个结点位置前插入元素为val的结点，若插入成功返回true，否则返回false bool insert_pos_list(PNODE pHead, int pos, int val) { int i=1; PNODE p = pHead; while ( NULL != p->pNext && i<pos ) { p = p->pNext; i++; }//将p的指向,移动到pos项的前一项 if ( NULL == p->pNext || pos <i ) return false; else {  PNODE pNew = (PNODE)malloc(sizeof(PNODE)); if ( NULL == pNew ) { printf("内存分配失败!\n"); exit(-1); } pNew->data = val; pNew->pNext = p->pNext; p->pNext = pNew; } return true; }   //从单链表中删除表头结点，并把该结点的值返回，若删除失败则停止程序运行 int delpHead(PNODE pHead) { PNODE p = NULL; int val; if ( NULL == pHead->pNext ) { exit(-1); } else { p = pHead->pNext; val = p->data; pHead->pNext = p->pNext; free(p);//该行不注释就出错!!求解... p = NULL; return val; }  }   我用gcc测试了，并没有出错[/quote] 我用的是VC测试的,弹出一个对话框出来,不清楚是什么问题...你再试试.

user: user-8
content: 引用 14 楼 sadadi 的回复:free(p) p=NULL 改 p=NULL free(p) 这个有问题，p指向空了，还free他干嘛

user: user-9
content: 请输入您要生成的链表的长度:len = 5 请输入第1个节点的值!1 请输入第2个节点的值!2 请输入第3个节点的值!3 请输入第4个节点的值!4 请输入第5个节点的值!5 1 2 3 4 5 1 2 3 4 5 9999 1 2 3 4 5 表头值为: 9999  Process returned 0 (0x0)   execution time : 7.747 s Press any key to continue.

user: user-9
content: 为什么我编译没错？

user: user-0
content: # include <stdio.h> # include <malloc.h> # include <stdlib.h>  typedef struct Node { int data; struct Node * pNext; }NODE, *PNODE; PNODE create_list(void);//生成链表 void traverse(PNODE);//遍历链表 int lenth_list(PNODE);//求链表的长度 bool empty_list(PNODE);//判断链表是否为空 void evacuate_list(PNODE);//清除线性表L中的所有元素，即释放单链表L中所有的结点，使之成为一个空表 void back_value_list(PNODE, int);//输出单链表中第pos个结点中的元素，若pos超出范围，提示输出值不存在 int * back_pdata_list(PNODE, int); //从单链表中查找具有给定值x的第一个元素，若查找成功则返回该结点data域的存储地址，否则返回NULL bool revise_value_list(PNODE, int, int);//把单链表中第pos个结点的值修改为x的值，若修改成功返回 true，否则返回 false void insert_list(PNODE, int);//向单链表的表头插入一个元素val void add_list(PNODE, int);//向单链表的末尾添加一个元素val bool insert_pos_list(PNODE, int, int);//向单链表中第pos个结点位置插入元素为x的结点，若插入成功返回true，否则返回false int delpHead(PNODE pHead);//删除表头值,并返回,如果失败,中止程序~! int main(void) { PNODE pHead = NULL; pHead = create_list(); traverse(pHead);  // if ( empty_list(pHead) ) // printf("链表为空!\n"); // else  // printf("非空\n"); // evacuate_list(pHead);//清空链表 // printf("链表的长度为:%d\n", lenth_list(pHead) ); // back_value_list(pHead,4);//输出头指针pHead的线性表中的第4个节点中的值 //int * s = back_pdata_list(pHead,8); // printf("%p \n",s); // revise_value_list(pHead, 5, 88);//printf("将第5个节点的值改为88\n新的线性表为:\n"); // insert_list(pHead,99);//表头插入 // add_list(pHead, 888);//表尾追加 traverse(pHead); insert_pos_list(pHead, 1,9999); traverse(pHead); int val = delpHead(pHead); printf("表头值为: %d\n", val); return 0; }  //初始化链表 PNODE create_list(void) { int len,i,val; printf("请输入您要生成的链表的长度:len = "); scanf("%d", &len); PNODE pHead = (PNODE)malloc(sizeof(NODE)); if ( NULL == pHead ) { printf("内存分配失败!\n"); exit(-1); } PNODE pt = pHead; pt->pNext = NULL;  for (i=0; i<len; i++) { PNODE pNew = (PNODE)malloc(sizeof(NODE)); if ( NULL == pNew ) { printf("内存分配失败!\n"); exit(-1); } printf("请输入第%d个节点的值!", i+1); scanf("%d", &(pNew->data) );  pt->pNext = pNew; pt = pNew; pt->pNext = NULL; }   return pHead; }   void traverse(PNODE pHead) { PNODE p = pHead; while (NULL != p->pNext) { p = p->pNext; printf("%d ",p->data);  } printf("\n"); return; }  //链表的长度 int lenth_list(PNODE pHead) { int n=0; PNODE p = pHead; while (NULL != p->pNext) { p = p->pNext; n++; } return n; }  //判断链表是否为空 bool empty_list(PNODE pHead) { if ( NULL == pHead->pNext) return true; else return false; }  //清空链表 void evacuate_list(PNODE pHead) { if (NULL == pHead->pNext) return; else  { PNODE p = pHead->pNext; PNODE q; printf("%p", p->pNext); while (NULL != p->pNext) { q = p->pNext; free(p); p = q; } free(p); pHead->pNext = NULL; } return; }   //返回单链表中第pos个结点中的元素，若pos超出范围，则返回flase void back_value_list(PNODE pHead,int pos) { int i = 1; PNODE p = pHead; while ( p->pNext != NULL && i <= pos ) { p = p->pNext; i++; } if ( p != pHead ) printf("第%d个值为:%d\n", pos, p->data); else printf("返回值不存在,中止程序!\n"); }   int * back_pdata_list(PNODE pHead,int val)//从单链表中查找具有给定值x的第一个元素，若查找成功则返回该结点data域的存储地址，否则返回NULL { PNODE p = pHead; while (p->pNext != NULL && (p->pNext)->data != val) { p=p->pNext; } if (NULL == p->pNext) return NULL; else return &((p->pNext)->data); }  //把单链表中第pos个结点的值修改为val的值，若修改成功返回 true，否则返回 false bool revise_value_list(PNODE pHead,int pos,int val) { PNODE p = pHead; int i=1; while (NULL != p->pNext && i<=pos) { p = p->pNext; i++; }  if ( i-1 == pos) { p->data = val; return true; } else return false; }  //向单链表的表头插入一个元素val void insert_list(PNODE pHead,int val) { PNODE pNew = (PNODE)malloc(sizeof(NODE)); if (NULL == pNew) { printf("内存分配失败!\n"); exit(-1); } pNew->data = val; pNew->pNext = NULL; if ( empty_list(pHead) ) pHead->pNext = pNew; else { PNODE q = pHead->pNext; pHead->pNext = pNew; pNew->pNext = q; } return; }  //向单链表的末尾添加一个元素val void add_list(PNODE pHead, int val) { PNODE p = pHead; while (NULL != p->pNext) { p = p->pNext; } PNODE pNew = (PNODE)malloc(sizeof(NODE)); pNew->data = val; pNew->pNext = NULL; p->pNext = pNew; }  //向单链表中第pos个结点位置前插入元素为val的结点，若插入成功返回true，否则返回false bool insert_pos_list(PNODE pHead, int pos, int val) { int i=1; PNODE p = pHead; while ( NULL != p->pNext && i<pos ) { p = p->pNext; i++; }//将p的指向,移动到pos项的前一项 if ( NULL == p->pNext || pos <i ) return false; else {  PNODE pNew = (PNODE)malloc(sizeof(PNODE)); if ( NULL == pNew ) { printf("内存分配失败!\n"); exit(-1); } pNew->data = val; pNew->pNext = p->pNext; p->pNext = pNew; } return true; }   //从单链表中删除表头结点，并把该结点的值返回，若删除失败则停止程序运行 int delpHead(PNODE pHead) { PNODE p = NULL; int val; if ( NULL == pHead->pNext ) { exit(-1); } else { p = pHead->pNext; val = p->data; pHead->pNext = p->pNext; free(p);//该行不注释就出错!!求解... p = NULL; return val; }  }

user: user-0
content: 引用 4 楼 a515360208 的回复:也不知道旁边的代码插入  想让别人帮忙至少要多做点事情啊不太明白,我才来论坛两天!

user: user-10
content: 引用 7 楼 qq597955169 的回复:# include <stdio.h> # include <malloc.h> # include <stdlib.h>  typedef struct Node { int data; struct Node * pNext; }NODE, *PNODE; PNODE create_list(void);//生成链表 void traverse(PNODE);//遍历链表 int lenth_list(PNODE);//求链表的长度 bool empty_list(PNODE);//判断链表是否为空 void evacuate_list(PNODE);//清除线性表L中的所有元素，即释放单链表L中所有的结点，使之成为一个空表 void back_value_list(PNODE, int);//输出单链表中第pos个结点中的元素，若pos超出范围，提示输出值不存在 int * back_pdata_list(PNODE, int); //从单链表中查找具有给定值x的第一个元素，若查找成功则返回该结点data域的存储地址，否则返回NULL bool revise_value_list(PNODE, int, int);//把单链表中第pos个结点的值修改为x的值，若修改成功返回 true，否则返回 false void insert_list(PNODE, int);//向单链表的表头插入一个元素val void add_list(PNODE, int);//向单链表的末尾添加一个元素val bool insert_pos_list(PNODE, int, int);//向单链表中第pos个结点位置插入元素为x的结点，若插入成功返回true，否则返回false int delpHead(PNODE pHead);//删除表头值,并返回,如果失败,中止程序~! int main(void) { PNODE pHead = NULL; pHead = create_list(); traverse(pHead);  // if ( empty_list(pHead) ) // printf("链表为空!\n"); // else  // printf("非空\n"); // evacuate_list(pHead);//清空链表 // printf("链表的长度为:%d\n", lenth_list(pHead) ); // back_value_list(pHead,4);//输出头指针pHead的线性表中的第4个节点中的值 //int * s = back_pdata_list(pHead,8); // printf("%p \n",s); // revise_value_list(pHead, 5, 88);//printf("将第5个节点的值改为88\n新的线性表为:\n"); // insert_list(pHead,99);//表头插入 // add_list(pHead, 888);//表尾追加 traverse(pHead); insert_pos_list(pHead, 1,9999); traverse(pHead); int val = delpHead(pHead); printf("表头值为: %d\n", val); return 0; }  //初始化链表 PNODE create_list(void) { int len,i,val; printf("请输入您要生成的链表的长度:len = "); scanf("%d", &len); PNODE pHead = (PNODE)malloc(sizeof(NODE)); if ( NULL == pHead ) { printf("内存分配失败!\n"); exit(-1); } PNODE pt = pHead; pt->pNext = NULL;  for (i=0; i<len; i++) { PNODE pNew = (PNODE)malloc(sizeof(NODE)); if ( NULL == pNew ) { printf("内存分配失败!\n"); exit(-1); } printf("请输入第%d个节点的值!", i+1); scanf("%d", &(pNew->data) );  pt->pNext = pNew; pt = pNew; pt->pNext = NULL; }   return pHead; }   void traverse(PNODE pHead) { PNODE p = pHead; while (NULL != p->pNext) { p = p->pNext; printf("%d ",p->data);  } printf("\n"); return; }  //链表的长度 int lenth_list(PNODE pHead) { int n=0; PNODE p = pHead; while (NULL != p->pNext) { p = p->pNext; n++; } return n; }  //判断链表是否为空 bool empty_list(PNODE pHead) { if ( NULL == pHead->pNext) return true; else return false; }  //清空链表 void evacuate_list(PNODE pHead) { if (NULL == pHead->pNext) return; else  { PNODE p = pHead->pNext; PNODE q; printf("%p", p->pNext); while (NULL != p->pNext) { q = p->pNext; free(p); p = q; } free(p); pHead->pNext = NULL; } return; }   //返回单链表中第pos个结点中的元素，若pos超出范围，则返回flase void back_value_list(PNODE pHead,int pos) { int i = 1; PNODE p = pHead; while ( p->pNext != NULL && i <= pos ) { p = p->pNext; i++; } if ( p != pHead ) printf("第%d个值为:%d\n", pos, p->data); else printf("返回值不存在,中止程序!\n"); }   int * back_pdata_list(PNODE pHead,int val)//从单链表中查找具有给定值x的第一个元素，若查找成功则返回该结点data域的存储地址，否则返回NULL { PNODE p = pHead; while (p->pNext != NULL && (p->pNext)->data != val) { p=p->pNext; } if (NULL == p->pNext) return NULL; else return &((p->pNext)->data); }  //把单链表中第pos个结点的值修改为val的值，若修改成功返回 true，否则返回 false bool revise_value_list(PNODE pHead,int pos,int val) { PNODE p = pHead; int i=1; while (NULL != p->pNext && i<=pos) { p = p->pNext; i++; }  if ( i-1 == pos) { p->data = val; return true; } else return false; }  //向单链表的表头插入一个元素val void insert_list(PNODE pHead,int val) { PNODE pNew = (PNODE)malloc(sizeof(NODE)); if (NULL == pNew) { printf("内存分配失败!\n"); exit(-1); } pNew->data = val; pNew->pNext = NULL; if ( empty_list(pHead) ) pHead->pNext = pNew; else { PNODE q = pHead->pNext; pHead->pNext = pNew; pNew->pNext = q; } return; }  //向单链表的末尾添加一个元素val void add_list(PNODE pHead, int val) { PNODE p = pHead; while (NULL != p->pNext) { p = p->pNext; } PNODE pNew = (PNODE)malloc(sizeof(NODE)); pNew->data = val; pNew->pNext = NULL; p->pNext = pNew; }  //向单链表中第pos个结点位置前插入元素为val的结点，若插入成功返回true，否则返回false bool insert_pos_list(PNODE pHead, int pos, int val) { int i=1; PNODE p = pHead; while ( NULL != p->pNext && i<pos ) { p = p->pNext; i++; }//将p的指向,移动到pos项的前一项 if ( NULL == p->pNext || pos <i ) return false; else {  PNODE pNew = (PNODE)malloc(sizeof(PNODE)); if ( NULL == pNew ) { printf("内存分配失败!\n"); exit(-1); } pNew->data = val; pNew->pNext = p->pNext; p->pNext = pNew; } return true; }   //从单链表中删除表头结点，并把该结点的值返回，若删除失败则停止程序运行 int delpHead(PNODE pHead) { PNODE p = NULL; int val; if ( NULL == pHead->pNext ) { exit(-1); } else { p = pHead->pNext; val = p->data; pHead->pNext = p->pNext; free(p);//该行不注释就出错!!求解... p = NULL; return val; }  }   我用gcc测试了，并没有出错

user: user-11
content: 也许是内存释放错误，你释放的大于你申请的了