Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
冒泡排序添加到缓冲区的字符串,这是在结构C编程中_C - Fatal编程技术网

冒泡排序添加到缓冲区的字符串,这是在结构C编程中

冒泡排序添加到缓冲区的字符串,这是在结构C编程中,c,C,试图解释我在做什么可能有点困惑,但上下文是:我为一个MUD多用户地下城编写了一个代码,并且我创建了一个结构,当玩家死亡发生时,它会写入一个.sav文件,然后在每次MUD重新启动时加载到该结构中 结构是这样的: struct pkill_data { PKILL_DATA *next; char *name; char *victim; sh_int wl; sh_int

试图解释我在做什么可能有点困惑,但上下文是:我为一个MUD多用户地下城编写了一个代码,并且我创建了一个结构,当玩家死亡发生时,它会写入一个.sav文件,然后在每次MUD重新启动时加载到该结构中

结构是这样的:

    struct pkill_data
{
    PKILL_DATA       *next;
    char             *name;
    char             *victim;
    sh_int           wl;
    sh_int           location;
    sh_int           vclass;
    sh_int           vrace;
    sh_int           clevel;
    sh_int           vlevel;
    time_t           date;
};
以及创建函数:

void update_pkill( CHAR_DATA* ch, CHAR_DATA* victim, int wl, int location, time_t date){
  PKILL_DATA* pkill;
  if (IS_NULLSTR( ch->name ) || IS_NULLSTR( victim->name ))
    return;
    pkill = new_pkill();
    pkill->name  = str_dup(ch->name);
    pkill->victim= str_dup(victim->name);
    pkill->vclass = victim->class;
    pkill->vrace = victim->race;
    pkill->date = date;
    pkill->vlevel = victim->level;
    pkill->clevel = ch->level;
    pkill->wl = wl;
    pkill->location = location;

    add_pkill(pkill);
    save_pkills();
}

PKILL_DATA* pkill_list;

void add_pkill( PKILL_DATA* pkill){
  if (pkill_list == NULL){
    pkill_list = pkill;
    pkill->next = NULL;
  }
  else{
    pkill->next = pkill_list;
    pkill_list = pkill;
  }
}
PKILL_DATA* get_pkill( char* name, char* victim ){
  PKILL_DATA* pkill = pkill_list;

  for (;pkill; pkill = pkill->next){
    if (str_cmp(name, pkill->name))
      continue;
    else if (!IS_NULLSTR(victim) && str_cmp(pkill->victim, victim))
      continue;
    return pkill;
  }
  return NULL;
}

void load_pkills(){
  PKILL_DATA* pkill;
  FILE *fp;
  char path[128];
  char letter;
  char* word;

  fclose( fpReserve );
  sprintf( path, "%s%s", PKILL_DIR, PKILL_FILE);
  if ( ( fp = fopen( path, "r" ) ) == NULL ){
    fp = fopen( NULL_FILE, "r" );
    fclose (fp);
    perror( path );
    return;
  }

  for (;;){
    letter              = fread_letter( fp );
    if ( letter != '#' ){
      bug( "load_pkill: # not found.", 0 );
      exit( 1 );
    }
    word   = feof( fp ) ? "END" : fread_word( fp );
    if ( !str_cmp(word, "END"))
      break;
    else if (!str_cmp(word, "PKILL")){
      pkill = new_pkill();
      fread_pkill( fp, pkill );
      add_pkill( pkill );
    }
  }
  fclose( fp );
  fpReserve = fopen( NULL_FILE, "r" );

  prune_pkall();
}
以及写/读功能:

void fwrite_pkill( FILE* fp, PKILL_DATA* pkill){
  fprintf( fp, "#PKILL %s~ %s~ %d %d %d %d %d %d %ld\n",
           pkill->name,
           pkill->victim,
           pkill->clevel,
           pkill->vlevel,
           pkill->vrace,
           pkill->vclass,
           pkill->wl,
           pkill->location,
           pkill->date);
}

void fread_pkill( FILE* fp, PKILL_DATA* pkill ){
  pkill->name    =       fread_string( fp );
  pkill->victim =       fread_string( fp );
  pkill->clevel =       fread_number( fp );
  pkill->vlevel =       fread_number( fp );
  pkill->vrace  =       fread_number( fp );
  pkill->vclass =       fread_number( fp );
  pkill->wl     =       fread_number( fp );
  pkill->location    =       fread_number( fp );
  pkill->date   =       fread_number( fp );
}

void save_pkills(){
  FILE *fp;
  PKILL_DATA* pkill = pkill_list;
  char path[128];

  fclose( fpReserve );
  sprintf( path, "%s%s", PKILL_DIR, PKILL_FILE);
  if ( ( fp = fopen( path, "w" ) ) == NULL ){
    fp = fopen( NULL_FILE, "r" );
    fclose (fp);
    perror( path );
    return;
  }
/* loop through pkills and save */
  for (; pkill; pkill = pkill->next ){
    fwrite_pkill( fp, pkill);
  }
  fprintf( fp, "#END\n" );
  fclose( fp );
  fpReserve = fopen( NULL_FILE, "r" );
}
和加载函数:

void update_pkill( CHAR_DATA* ch, CHAR_DATA* victim, int wl, int location, time_t date){
  PKILL_DATA* pkill;
  if (IS_NULLSTR( ch->name ) || IS_NULLSTR( victim->name ))
    return;
    pkill = new_pkill();
    pkill->name  = str_dup(ch->name);
    pkill->victim= str_dup(victim->name);
    pkill->vclass = victim->class;
    pkill->vrace = victim->race;
    pkill->date = date;
    pkill->vlevel = victim->level;
    pkill->clevel = ch->level;
    pkill->wl = wl;
    pkill->location = location;

    add_pkill(pkill);
    save_pkills();
}

PKILL_DATA* pkill_list;

void add_pkill( PKILL_DATA* pkill){
  if (pkill_list == NULL){
    pkill_list = pkill;
    pkill->next = NULL;
  }
  else{
    pkill->next = pkill_list;
    pkill_list = pkill;
  }
}
PKILL_DATA* get_pkill( char* name, char* victim ){
  PKILL_DATA* pkill = pkill_list;

  for (;pkill; pkill = pkill->next){
    if (str_cmp(name, pkill->name))
      continue;
    else if (!IS_NULLSTR(victim) && str_cmp(pkill->victim, victim))
      continue;
    return pkill;
  }
  return NULL;
}

void load_pkills(){
  PKILL_DATA* pkill;
  FILE *fp;
  char path[128];
  char letter;
  char* word;

  fclose( fpReserve );
  sprintf( path, "%s%s", PKILL_DIR, PKILL_FILE);
  if ( ( fp = fopen( path, "r" ) ) == NULL ){
    fp = fopen( NULL_FILE, "r" );
    fclose (fp);
    perror( path );
    return;
  }

  for (;;){
    letter              = fread_letter( fp );
    if ( letter != '#' ){
      bug( "load_pkill: # not found.", 0 );
      exit( 1 );
    }
    word   = feof( fp ) ? "END" : fread_word( fp );
    if ( !str_cmp(word, "END"))
      break;
    else if (!str_cmp(word, "PKILL")){
      pkill = new_pkill();
      fread_pkill( fp, pkill );
      add_pkill( pkill );
    }
  }
  fclose( fp );
  fpReserve = fopen( NULL_FILE, "r" );

  prune_pkall();
}
以上所有信息可能都太多了。基本轮廓是我将所有内容保存到一个文件中,每当mud重新启动或创建PKLL时,该文件就会加载到一个结构/表中,因此我可以在任何给定时间从该列表中提取

我希望在将这些pkill添加到缓冲区进行查看后,能够按创建日期(即pkill->date)查看这些pkill。我不确定如何使用缓冲区创建气泡列表,或者在打印给用户之前如何对缓冲区进行排序

下面,add_buf只是其他地方使用的一个bool:

bool add_buf(BUFFER *buffer, char *string)
{
    int len, oldsize = buffer->size;
    char *oldstr = buffer->string;
    if (buffer->state == BUFFER_OVERFLOW)
        return FALSE;
    len = strlen(buffer->string) + strlen(string) + 1;
    while (len >= buffer->size)
    {
        buffer->size    = get_size(buffer->size + 1);
        {
            if (buffer->size == -1)
            {
                buffer->size = oldsize;
                buffer->state = BUFFER_OVERFLOW;
                bug("buffer overflow past size %d",buffer->size);
                return FALSE;
            }
        }
    }
    if (buffer->size != oldsize)
    {
        buffer->string  = alloc_mem(buffer->size);
        strcpy(buffer->string,oldstr);
        free_mem(oldstr,oldsize);
    }
    strcat(buffer->string,string);
    return TRUE;
}
至于实际的问题——如何在结构中的字符串中使用冒泡排序?这就是我到目前为止所做的:

  PKILL_DATA* pkill;
  BUFFER* buffer;
  char buf[MIL];


  buffer = new_buf();
  for (pkill = pkill_list ; pkill ; pkill = pkill->next ){
    if (str_cmp(pkill->name, argument))
      continue;
    sprintf(buf, "%s %s %d %d %d %d %d %d %ld\n\r", pkill->name, pkill->victim, pkill->clevel, pkill->vlevel, pkill->vrace, pkill->vclass, pkill->wl, pkill->location, pkill->date);
  }
  page_to_char(buf_string(buffer),ch);
  free_buf(buffer);

可以想象,它根本没有排序,而是从文件的顶部到底部列出它们,或者不管它们是以何种方式加载到字符串/结构中的。

它必须是气泡排序吗?如果没有,你可以使用stdlib.h中的qsort和一个自定义的比较回调。我不明白你想从这些混乱中排序什么…@DrewMcGowen:它不必是冒泡排序-我想这只是我能找到的唯一可能有效的东西?我来看看qsort。谢谢。@DrewMcGowen qsort不适用于链表,对吗?您需要重新实现处理它们的功能,包括交换下一个/上一个指针以按顺序解释差异。@ChronoKitsune我完全没有注意到这一点-正确,qsort不适用于链接列表。