2016-06-09 134 views
0

我有以下代碼。它運行良好。但有時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;

+0

沒有檢查好,'readt'將一個釋放的指針放在鏈表中,它可能是壞的。 – MikeCAT

+0

你試過調試你的代碼嗎? –

+0

是的,我試過調試。通過調試,我可以告訴它不會在readt函數中產生問題,而是在del和/或ins函數中創建問題。我禁用了插件,並且只使用了del,並禁用了所有的操作,只保留posof函數。但在某些情況下,它甚至沒有表現出色。 – LSG

回答

0

該程序包含內存泄漏。內存在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檢查,沒有任何內存泄漏。

相關問題