为什么我的函数有时会进入无限循环?

Why does my function go into infinite loop sometimes?

我有以下代码。 运行 很好。但有时 del 和 ins 函数会进入无限循环,但有时工作正常。 readt 函数工作正常,我仍然将其包含在内以供您参考。我的del和ins有什么问题?有没有内存泄漏?

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#include<math.h>
#include<unistd.h>

struct node
{   int info;
    struct node *link;
};
typedef struct node m;

m *search(int,m*);
m *del(int,m*);
m *ins(int,int,m*);
int posof(int,m*);


int readt(m *t_c,char path[])
{   int t,szt=0;
    FILE *tfile;
    char ch;
    char filename[]="/temp.txt";
    strcat(path,filename);
    tfile=fopen(path,"r");
    if(tfile==NULL)
        exit(0);
    fseek(tfile, 0, SEEK_END);
    szt = ftell(tfile);
    fseek(tfile,0,SEEK_SET);
    if(szt!=0)
    {   while(1)
        {   fscanf(tfile,"%d%c",&t,&ch);
            t_c->info=t;
            t_c->link=(m*)malloc(sizeof(m));
            t_c=t_c->link;
            if(ch==';')
                break;
        }       
    }
    t_c->link=NULL;
    //free(t_c);
    fclose(tfile);
    return 0;
}

m *search(int Noftarget,m *t_c)
{   int i,p1,p2;
    srand(time(NULL));
    for(i=0;i<100;i++)
    {   p1=(1+rand()%(Noftarget));
        p2=(1+rand()%(Noftarget));
        t_c=del(p1,t_c);
        t_c=ins(p1,p2,t_c);
        break;
    }
    return t_c;
}

m *del(int target,m *t_h)
{   m *t_c;
    int j=1,i;
    t_c=t_h;
    i=posof(target,t_h);
    if(i==1)
    {   t_c=t_c->link;
        t_h=t_c;
    }
    else
    {   while(j<i-1)
        {   t_c=t_c->link;
            j++;
        }
        t_c->link=t_c->link->link;
    }
    return t_h;
}

m *ins(int target,int position,m *t_h)
{   int j=0;
    m *swaptarget,*t_c;
    t_c=t_h;
    swaptarget=(m*)malloc(sizeof(m));
    swaptarget->info=target;
    if(position==1)
    {   swaptarget->link=t_c;
        t_h=swaptarget;
    }
    else
    {   while(j<position-2)
        {   t_c=t_c->link;
            j++;
        }
        swaptarget->link=t_c->link;
        t_c->link=swaptarget;
    }
    free(swaptarget);
    return t_h;
}

int posof(int p1,m *t_c)
{   int i=1,a=0;
    while(t_c->link!=NULL)
    {   if(p1==t_c->info)
        {   a=i;
            break;
        }
        t_c=t_c->link;
        i++;
    }
    return a;
}

int main()
{   int Noftarget=8,j,r=1,count=0,noi,szd_n=0,i=0,sz;
    char cwd[200];
    m *t_h;
    getcwd(cwd, sizeof(cwd));
    t_h=(m*)malloc(sizeof(m));
    readt(t_h,cwd);
    t_h=search(Noftarget,t_h);
    free(t_h);
    return 0;
}

临时文件的内容是: 1,2,3,4,5,6,7,8;

该程序存在内存泄漏。内存在 while 循环内迭代分配,但最后只有一个指针被删除。需要删除所有分配。并且不需要释放ins函数处的任何指针,而del函数需要释放指针的删除操作。修改后的代码在这里:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#include<math.h>
#include<unistd.h>

struct node
{   int info;
    struct node *link;
};
typedef struct node m;

m *search(int,m*);
m *del(int,m*);
m *ins(int,int,m*);
int posof(int,m*);


int readt(m *t_c,char path[])
{   int t,szt=0;
    FILE *tfile;
    char ch;
    char filename[]="/temp.txt";
    strcat(path,filename);
    tfile=fopen(path,"r");
    if(tfile==NULL)
        exit(0);
    fseek(tfile, 0, SEEK_END);
    szt = ftell(tfile);
    fseek(tfile,0,SEEK_SET);
    if(szt!=0)
    {   while(1)
        {   fscanf(tfile,"%d%c",&t,&ch);
            t_c->info=t;
            t_c->link=(m*)malloc(sizeof(m));
            //printf("%d ",t_c->info);
            t_c=t_c->link;
            if(ch==';')
                break;
        }       
    }
    t_c->link=NULL;
    //free(t_c);
    fclose(tfile);
    return 0;
}
m *search(int Noftarget,m *t_c)
{   int i,p1,p2;
    srand(time(NULL));
    for(i=0;i<100;i++)
    {   p1=(1+rand()%(Noftarget));
        p2=(1+rand()%(Noftarget));
        t_c=del(p1,t_c);
        t_c=ins(p1,p2,t_c);
        break;
    }
    return t_c;
}
m *del(int target,m *t_h)
{   m *t_c;
    int j=1,i;
    t_c=t_h;
    i=posof(target,t_h);
    if(i==1)
    {   free(t_c);
        t_c=t_c->link;
        t_h=t_c;
    }
    else
    {   while(j<i-1)
        {   t_c=t_c->link;
            j++;
        }
        free(t_c->link);
        t_c->link=t_c->link->link;
    }
    return t_h;
}
m *ins(int target,int position,m *t_h)
{   int j=0;
    m *swaptarget,*t_c;
    t_c=t_h;
    swaptarget=(m*)malloc(sizeof(m));
    swaptarget->info=target;
    if(position==1)
    {   swaptarget->link=t_c;
        t_h=swaptarget;
    }
    else
    {   while(j<position-2)
        {   t_c=t_c->link;
            j++;
        }
        swaptarget->link=t_c->link;
        t_c->link=swaptarget;
    }
    return t_h;
}
int posof(int p1,m *t_c)
{   int i=1,a=0;
    while(t_c->link!=NULL)
    {   if(p1==t_c->info)
        {   a=i;
            break;
        }
        t_c=t_c->link;
        i++;
    }
    return a;
}

int main()
{   int Noftarget=7,j,r=1,count=0,noi,szd_n=0,i=0,sz;
    char cwd[200];
    m *t_h;
    getcwd(cwd, sizeof(cwd));
    t_h=(m*)malloc(sizeof(m));
    readt(t_h,cwd);
    print_tsp(t_h);
    t_h=search(Noftarget,t_h);
    print_tsp(t_h);
    while(t_h!=NULL)
    {   free(t_h);
        t_h=t_h->link;
    }
    return 0;
}

通过valgrind检查,没有内存泄漏。