在无限循环 C 中运行



我在无限循环中运行,我不知道为什么。我试图调试我的代码但没有成功。也许有人可以帮助我解决这个问题。

void init_list(list* mylist)
{
mylist->first = NULL;
mylist->last = NULL;
}

void insert_list(list_element* le, list* mylist)
{
if(mylist->first == NULL)
{
mylist->first = le;
mylist->last = le;
return;
}
mylist->last->next = le;
mylist->last = le;
//printf("Test");
return;
}
void free_list(list* mylist)
{
list_element* tmp = mylist->first;
while(tmp->next != NULL)
{
free(mylist->first->password);
free(mylist->first);
tmp = tmp->next;
mylist->first = tmp;
}
}

void read_data(char* filename, list* mylist)
{
FILE * file = fopen(filename,"r");
char line[100];

while (fgets(line, sizeof(line), file) != NULL)
{
char * teile;
int index;
teile = strrchr(line, ' ');
//printf("%sn",teile);
index = (int) (teile - line);
//printf("%dn",index);
char password[index+1];
strncpy(password, line, index);
password[index] = '';
//printf("%sn",password);
list_element * le = malloc(sizeof(list_element));
le->password = malloc(sizeof(char) * (strlen(password)+1));
strncpy(le->password,password,(strlen(password)+1));
le->next = NULL;
int anzahl = atoi(teile);
le->count = anzahl;
//printf("%d %sn", le->count, le->password);
insert_list(le, mylist);
}
fclose(file);
}
list_element* partition( list* input, list* left, list* right )
{
list_element * pivot = input->first;

list_element * tmp;
for (tmp = pivot->next; tmp != NULL; tmp= tmp->next)
{
if((tmp->count) < (pivot->count))
{
insert_list(tmp, left);
}
else
{
insert_list(tmp, right);
}
}  
return pivot;
}
void qsort_list(list* mylist)
{
list right;
init_list(&right);
list left;
init_list(&left);
list_element* pivot;
if(mylist->first != mylist->last)
{
pivot = partition(mylist, &left, &right );
qsort_list(&left);
qsort_list(&right);

if(left.first == NULL) 
{
mylist->first = pivot;
} 
else 
{
mylist->first = left.first;
left.last->next = pivot;
}
if(right.first == NULL) 
{
pivot->next = right.first;
mylist->last = pivot;
} 
else 
{
pivot->next = right.first;
mylist->last = right.last;
}     
}
return;
}
void print_list(list* mylist)
{
list_element * current = mylist->first;
while (current != NULL)
{
printf("%s %d n", current->password, current->count);
current = current->next;
}
}

它在insert_list部分中循环。从read_data打电话后。它也仅在最后一次调用函数时循环。

int main(int argc, char** args)
{
if (argc != 2)
{
printf("USE: %s <Filename>n",args[0]);
return 1;
}
list mylist;
init_list(&mylist);
read_data(args[1],&mylist);
qsort_list(&mylist);
printf("Sorted:n");
print_list(&mylist);
free_list(&mylist);
return 0;
}
typedef struct list_element list_element;
struct list_element {
char *password;
int count;
list_element* next;
};
typedef struct list list;
struct list {
list_element* first;
list_element* last;
};

输入如下:

asdfgh 31554
snoopy1 15637
qwertyuiop 24372

编辑:修复了输入。 编辑2:在注释的帮助下修复了代码。现在我在我的分区函数中循环运行。

嗯,这是错误的

char password[index];
strncpy(password, line, index);
password[index] = '';

您分配index个字符数,但用最后一个语句覆盖数组外部。您应该改为使用

char password[index+1];

函数read_data至少有三个严重的错误。

首先,您应该检查文件是否成功打开。

其次,您使用索引index写入数组密码之外的内容,因为您没有在数组中为终止零保留内存。

char password[index];
strncpy(password, line, index);
password[index] = '';

在此声明中

le->password = password;

列表的所有元素都分配有一个指针,指向退出函数后将不活动的本地数组。 您必须为每个数据成员分配动态内存le->password

因此,程序在任何情况下都有未定义的行为。

函数free_list

void free_list(list* mylist)
{
free(mylist->first);
free(mylist);
}

不会释放所有分配的内存。

此外,您在列表的设计中存在逻辑错误。如果你有一个twp端的链接列表,那么函数insert_list应该在列表的尾部附加一个新节点。否则,为单向链表设置尾节点就没有多大意义。

这是一个问题。 仔细查看您的free_list函数。

void free_list(list* mylist)
{
list_element* tmp = mylist->first;
while(tmp->next != NULL)
{
free(mylist->first->password);
free(mylist->first);
tmp = tmp->next;
}
free(mylist);
}

在第一次通过循环时,您设置 tmp = mylist->first,然后释放 mylist->first,然后尝试从 tmp 中获取"next"指针。 除了tmp指向的东西现在已经消失了,因为你刚刚释放了它。

相关内容

  • 没有找到相关文章

最新更新