大哥大姐们帮帮忙!!!free()函数的疑惑,从单链表中删除结点时报错.
如题:
// 问题出在删除结点函数中,其它几个函数是测试时的辅助模块
下面是源代码,编译器 VC6.0
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define FALSE 0
#define OK 1
typedef char * DataType;
typedef struct Link
{
DataType Data;
struct Link *next;
}Link;
void display( Link *L); /* 显示单链表中各结点的字符串数据 */
Link *CreateHeadNode(); /* 创建表头结点 */
int DeleteData(Link *head, DataType data);/* 删除一个指定数据的结点 */
int InsertRear( Link *L, DataType data );/* 在单链表表尾插入一个新结点 */
int main(int argc, char* argv[])
{
Link *head=NULL;
int i=0,status=0;
char *stra[7] = {"te","c","g","fa","b","d","abc"};
if( (head=CreateHeadNode()) == NULL) return 0;
/* 建一个单链表,测试 */
for( i=0; i<7; i++)
{
status = InsertRear(head,stra[i]);
if( status == 0 )return 0;
}
display(head);
/* 删除一个结点 */
if( DeleteData(head,"fa") != OK )
return 0;
display(head);
return 0;
}
/****************************************************************************************/
int DeleteData(Link *head, DataType data)
{
Link *q;
Link *p = head->next ;
if( p == NULL )
{
return FALSE;
}
q = head;
for( ; p != NULL; )
{
if( strcmp(p->Data ,data) ==0 )/* 字符串相等时删除该结点 */
{
q->next = p->next ; //暂时保存;
p->next = NULL;
/**********************************************************/
/*
** s = (Link *)malloc( sizeof(Link) );
** s->Data = (DataType )malloc( strlen(data) );
** 我在创建结点时,数据域用 malloc() 函数来分配一个空间,
** 用于存放字符串,在删除该结点时,按理应该先释放该内存空间,
** 然后再用 free( p ), 来释放该结点所占的内存;
** 为什么在删除该结点时,我用语句free( p->Data );
** 释放存储字符的内存时会出错???? 如果不释放该内存应该会产生内存泄漏
**
** 恳请XDJM 指点迷津;
*/
// free( p->Data ); /* 去掉注释就报错 */
/**********************************************************/
free(p);
return OK;
}
q = p;
p = p->next ;
}
printf("The Link has no the data!\n");
return FALSE;
}
void display( Link *L) /* 显示单链表中各结点的字符串数据 */
{
Link *p=NULL;
printf("The Data of the single Link is the Flowing:\n");
if( L->next == NULL )
{
printf("The Single Link is empty !\n");
return;
}
for( p = L->next ; p != NULL; )
{
printf(" %-7s ",p->Data );
p = p->next ;
}
printf(" End put !\n\n");
}
Link *CreateHeadNode() /* 创建表头结点 */
{
Link *head;
head = (Link *)malloc(sizeof(Link));
if( head == NULL )
{
printf("新结点创建失败!\n");
return NULL;
}
head->Data = 0;
head->next = NULL;
return head;
}
int InsertRear( Link *L, DataType data )/* 在单链表末尾插入一个结点 */
{
Link *p, *s ;
for( p = L ; p->next != NULL; )
{
p = p->next ;
}
s = (Link *)malloc( sizeof(Link) );
s->Data = (DataType )malloc( strlen(data) );
if( s == NULL || s->Data == NULL )
{
printf("新结点创建失败!\n");
return FALSE; /* 存储分配失败 */
}
strcpy(s->Data,data); /* 将数据复制到新建的结点中 */
s->next = p->next ;
p->next = s;
return OK;
}