首页 > 解决方案 > 在无限循环中运行 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("%s\n",teile);

    index = (int) (teile - line);

    //printf("%d\n",index);

    char password[index+1];

    strncpy(password, line, index);

    password[index] = '\0';

    //printf("%s\n",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 %s\n", 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

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

标签: cmemory-managementlinked-listquicksortsingly-linked-list

解决方案


好吧,这是错误的

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

您分配index字符数,但用最后一条语句覆盖数组外部。你应该分配而不是

char password[index+1];

推荐阅读