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