回 帖 发 新 帖 刷新版面

主题:free函数有问题啊,堆溢出了??欢迎大家帮我解答。。

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

struct soldier
{
    int num;
    struct soldier *next;
};
typedef struct soldier member;
typedef member* MEMBER;
MEMBER initial(int n);     //初始化链表,传入链表的结点个数,返回链表头结点
void Free(MEMBER headptr);   //删除释放链表

//current 当前结点  previous 前一结点  headptr 头结点
//total 结点个数 
int main()
{
    MEMBER current=NULL, previous=NULL, headptr=NULL;
    int i=0, j=0, m=0, total, a[10];

    printf("please input the number of soldiers:");
    scanf("%d", &total);
    headptr = initial(total);

    for(i=2; i<=total; i++)
    {
        current = headptr;
        while(current->num != i)   //将current指向到第i个结点
        {
            previous = current;
            current = current->next;
        }
        
        //若轮到删除第current个结点,且不是头结点(即加里森),则删除,并通过向后移5个结点,更新current的值找到下次需要删除的结点        
        while(current != headptr)  
        {
            current = current->next;
            previous->next = current;
            for(j=1; j<=4; j++)
            {
                previous = current;
                current = current->next;
            }
        }

        if(current->next == current)//若只剩下一个头结点,则i为所求值
            a[m++]=i;
        else  //否者此次尝试失败,重新进行下一次尝试,将链表恢复为初始状态
        {
            Free(headptr);
            headptr = initial(total);
        }
    }
    for(j=0; j<=m; j++)
        printf("the answer is %d",a[j]);
    return 0;
}

MEMBER initial(int n)
{
    int i;
    MEMBER headptr=NULL;
    MEMBER current=NULL, previous=NULL;
    headptr = (MEMBER) malloc (sizeof(MEMBER));
    if( headptr != NULL )  //创建头结点
    {
        headptr->num = 1;
        current = headptr;
        previous = current;
    }
    for(i=2; i<=n; i++)
    {
        current = (MEMBER) malloc (sizeof(MEMBER));
        if(current != NULL)   //内存分配成功后,将n个结点分别编号1~n
        {
            current->num = i;
            previous->next = current;
            previous = current;
        }
    }
    current->next = headptr;  //头结点与尾结点相连形成循环链表
    return headptr;
}

void Free(MEMBER headptr)
{
    MEMBER temp=NULL;
    temp = headptr;
    headptr = headptr->next;
    temp->next = NULL;
    while(headptr)  //若没有到最后一个结点,将各结点逐一释放
    {
        temp = headptr;
        headptr = headptr->next;
        if(temp != NULL)
            free(temp);
    }
}

回复列表 (共7个回复)

沙发

main函数中没看懂程序实现的意思,发现几处疑惑的地方,
①:init函数中headptr = (MEMBER) malloc (sizeof(MEMBER));应为
headptr = (MEMBER) malloc (sizeof(struct member));吧
②:Free函数个人感觉是有问题的,从main函数中
Free(headptr);
headptr = initial(total);
可以看出lz需要实现完全free开辟的空间,而lz的Free函数中
temp = headptr;
headptr = headptr->next;
temp->next = NULL;
while(headptr)
{
   temp = headptr;
   //...
}
这段明显导致内存泄露,头结点没有free.不知道指到哪个地方去了.

板凳


代码题目是“加里森的任务”,N个队员编号,从第i个人开始,5个人后那个的队员去执行任务,加里森是一号,代码的功能是找出从第几个人开始才能让加里森最后一个取去执行任务。
关于Free函数,我建立的是循环链表,所以我释放的时候将链表切断,然后headptr逐个后移删除,直到最后一个结点,为什么会内存泄露?没有存在headptr无指向的问题啊。。

3 楼

的确,我看错了,不好意思、、主体没时间看了,循环链表实现的约瑟夫环么。。

4 楼


循环链表而已。。那。。别的哪错了??每次运行都会中止=。=

5 楼

居然有人怀疑free函数出错了!

6 楼


=。=那你觉得哪错了??为什么总是中止呢

7 楼

中止的原因在一楼第一个原因中已经指出。

主函数循环体没去看了,这个慢慢调下就出来了

我来回复

您尚未登录,请登录后再回复。点此登录或注册