首页 新闻 赞助 找找看

C语言free函数报错

0
悬赏园豆:5 [已解决问题] 解决于 2012-09-27 08:28

代码如下:

Liner.h

#include<stdio.h>

#define Maxsize 7 

typedef int DataType;

//顺序表定义
typedef struct {
    DataType data[Maxsize];
    int length;
}SeqList;

void InsertSeqlist(SeqList* L,DataType x,int i);
void DeleteSeqlist(SeqList* L,int i);
int LocateSeqlist(SeqList* L,DataType x);
void PrintfSeqList(const SeqList L);

//单链表定义
typedef struct node{
    DataType data;      //数据域
    struct node* next;//指针域
} Node,*LinkList;

LinkList InitateLinkList();
int LengthLinkList(LinkList head);
Node * GetLinkList(LinkList head,int i);
int LocateLinkList(LinkList head,DataType x);
void InsertLinkList(LinkList head,DataType x,int i);
void DeleteLinkList(LinkList head,int i);
void PrintfLinkList(const LinkList head);

Liner.c

#include<stdio.h>
#include<stdlib.h>
#include"Liner.h"

void InsertSeqlist(SeqList* L,DataType x,int i)
{
    int j=0;
    //将元素x插入到顺序表L的第i个数据元素之前
    if(L->length==Maxsize)
    {
        exit(1);
    }

    //检测位置
    if(i<1 || i>L->length+1) exit(1);

    for(j=L->length;j>=i;j--)
        L->data[j]=L->data[j-1];

    L->data[j]=x;
    L->length++;
}

void DeleteSeqlist(SeqList* L,int i)
{
    int j=0;
    if(i<1 || i>L->length)
    { 
        printf("删除位置错误!");
        exit(1);
    }

    //删除操作
    for(j=i-1;j<L->length-1;j++)
    {
        L->data[j]=L->data[j+1];
    }

    L->length--;
}

int LocateSeqlist(SeqList* L,DataType x)
{
    int i=0;
    while((i<L->length) && L->data[i]!=x)
    i++;
    if(i<L->length) return i+1;
    else return 0;
}

void PrintfSeqList(const SeqList L)
{
    int i=0;
    for(i=0;i<L.length;i++)
        if(i!=L.length-1)
        printf("%d,",L.data[i]);
        else printf("%d\r\n",L.data[i]);

        if(L.length==0) printf("无\r\n");
}

//单链表操作算法
LinkList InitateLinkList()
{
    //建立一个空的单链表
    LinkList head;
    head=(LinkList)malloc(sizeof(Node));//强制转换
    head->next=NULL;
    return head;
}

int LengthLinkList(LinkList head)
{
    //求单链表的长度
    Node *p=head;
    int cnt=0;
    while(p->next!=NULL)
    {
        p=p->next;
        cnt++;
    }
    return cnt;
}

Node * GetLinkList(LinkList head,int i)
{
    int c=1;
    //获取指定为位置的节点
    Node *p;
    p=head->next;//head节点不存储数据
    
    while(c<i && p!=NULL)
    {
        p=p->next;c++;
    }

    if(i==c) return p;
    else return NULL;
}

int LocateLinkList(LinkList head,DataType x)
{
    //根据数据元素查找位置
    int i=1;
    Node *p=head->next;

    while(p!=NULL && p->data!=x)
    {
        p=p->next;i++;
    }

    if(p->data==x) return i;
    else return 0;
}

void InsertLinkList(LinkList head,DataType x,int i)
{
    Node *pre,*p;//pre是目标节点的前一个节点

    if(i==1) pre=head;
    else pre=GetLinkList(head,i-1);

    if(pre==NULL)
    {
        printf("找不到插入的位置!");
        return;
    }

    p=(Node*)malloc(sizeof(Node*));

    p->data=x;
    p->next=pre->next;
    pre->next=p;


}

void DeleteLinkList(LinkList head,int i)
{
    Node *q,*p;//q是直接前驱,p是待释放的节点

    if(i==1) q=head;
    else q=GetLinkList(head,i-1);

    if(q!=NULL && q->next!=NULL)
    {
        p=q->next;            //指向待释放的节点
        q->next=p->next;    //赋值给直接前驱的下一个节点
        
        free(p);
    }
    else exit(1);

}

void PrintfLinkList(const LinkList head)
{
    Node *p=(head->next);

    if(head==NULL) return;
    while(p!=NULL)
    {
        if((p->next)!=NULL)
        {
            printf("%d,",p->data);
        }
        else
        {
            printf("%d\r\n",p->data);
        }
        p=p->next;
    }
}

Test.c

#include<stdio.h>
#include"Liner.h"


int main(void)
{
    /*
    int i=0;

    SeqList student={{0},0};//声明并初始化
    InsertSeqlist(&student,1,1);
    InsertSeqlist(&student,2,2);
    InsertSeqlist(&student,3,3);
    InsertSeqlist(&student,4,4);
    InsertSeqlist(&student,5,5);
    InsertSeqlist(&student,6,6);
    
    printf("显示信息表元素:");
    PrintfSeqList(student);
    printf("线性表长度:%d\r\n\r\n",student.length);

    for(i=student.length;i>0;i--)
    {
        printf("执行删除操作...\r\n删除第%d个\r\n",i);
        DeleteSeqlist(&student,i);
        PrintfSeqList(student);
        printf("\r\n");
    }
    */
    int i=3;
    LinkList head=InitateLinkList();

    InsertLinkList(head,1,1);

    InsertLinkList(head,2,1);

    for(i=3;i<100;i++)
        InsertLinkList(head,i,i);

    PrintfLinkList(head);

    for(--i;i>3;i--)
        DeleteLinkList(head,i);
    
    printf("删除后:\r\n");
    PrintfLinkList(head);

    getchar();
    return 0;
}

 

问题:现在只要使用free函数就会报错。不使用就会造成内存泄露。

IceS的主页 IceS | 初学一级 | 园豆:197
提问于:2012-09-23 21:57
< >
分享
最佳答案
0

在void InsertLinkList(LinkList head,DataType x,int i) 中的这句代码写错了:

p=(Node*)malloc(sizeof(Node*));

应该为:

p=(Node*)malloc(sizeof(Node));

收获园豆:5
Launcher | 高人七级 |园豆:45045 | 2012-09-24 09:58
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册