| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3036 人关注过本帖
标题:排序高手进来看看 关于字符串多重排序的问题
只看楼主 加入收藏
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 9楼 wp231957
笑死了,看到你这个,我又想起了我写的那个变量名特别恶心的二级链表,改一改应该就可以满足你的新需求了。

[此贴子已经被作者于2017-3-13 19:02编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-03-13 18:58
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
回复 11楼 renkejun1942
麻烦共享一下

DO IT YOURSELF !
2017-03-13 19:06
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 12楼 wp231957
修改了,但是输入函数是个坑。
变量名,我实在不想碰,修改后,仅仅是能用了。

图片附件: 游客没有浏览图片的权限,请 登录注册


程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

struct word {
    char *words;
    struct word *Next;
};
struct word_tab {
    char *year;
    struct word_tab *Next;
    struct word *Word_Next;
};
int
index_word_tab( struct word_tab **p_total, char word[], char *year );
void
print_word( struct word_tab **p_total );
int
gettime( char *time, int size );


int
main( void )
{
    struct word_tab *p;
        char year[ 50 ];
    char date[ 50 ];
    char day[ 50 ];

    p = NULL;

    while( gettime( date, 50 ) > 0 )
    {
        if( gettime( day, 50 ) < 0 )
            break;
        if( gettime( year, 50 ) < 0 )
            break;

        strcat( date, "     ");
        strcat( date, day );
        index_word_tab( &p, date, year);
    }
    

        print_word( &p );
    
           getchar();
    
    return 0;
}


int
gettime( char *time , int limit )
{
    int ch;
    int i;

    for( i = 0; i < limit - 1 && ( ch = getchar() ) != EOF && !isspace( ch ); i++ )
        time[ i ] = ch;
    time[ i ] = '\0';

    return ch;

}
int
index_word_tab( struct word_tab **p_total, char word[], char *year )
{
        struct word_tab * next;
        struct word_tab * new_total;
        struct word * next_word;
        struct word * new_word;
        struct word ** kNext;
    
    while( ( next = *p_total ) != NULL && strcmp( next->year, year ) < 0 )
        p_total = &next->Next;
    
    if( next == NULL || strcmp( next->year, year ) != 0 )
        {
        new_total = ( struct word_tab * )malloc( sizeof( struct word_tab ) );
            if ( new_total == NULL )
                return 0;
            *p_total = new_total;
            new_total->Next = next;
            new_total->year = strdup( year );
            new_total->Word_Next = NULL;
        }
    
    kNext = &(*p_total)->Word_Next;
    
    while ( ( next_word = *kNext ) != NULL && strcmp( next_word->words, word ) <= 0)
        {
        if ( strcmp( next_word->words, word ) == 0 )
        {
                break;
        }
        kNext = &next_word->Next;
        }
    
    new_word = ( struct word * )malloc( sizeof( struct word ) );
        if ( new_word == NULL )
        return 0;
        *kNext = new_word;
        new_word->Next = next_word;
        new_word->words = strdup( word );
    
    return 1;
}


void
print_word( struct word_tab **p_total )
{
        struct word_tab *next;
        struct word *word_next;
    
    
    while( ( next = *p_total ) != NULL )
        {
        for( word_next = next->Word_Next; word_next != NULL; word_next = word_next->Next )
                fprintf( stderr, "%s %s \n", next->year, word_next->words );
        p_total = &next->Next;
        }
}


[此贴子已经被作者于2017-3-13 20:06编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-03-13 19:10
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
gettime就是输入函数???

谢谢了  这段代码 我估计得消化一段时间

DO IT YOURSELF !
2017-03-13 20:44
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 14楼 wp231957
我修改了一下,你看看,修改后的插入函数和打印函数会不会更容易读。
当然,只有插入和打印函数,我准备把我这个二级函数弄成一个比较通用的。
但是一堆Next,我再一次笑抽了。

程序代码:
/*用一个链表将多个链表连起来*/
/* 二级链表 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

struct Two_Node {
    char *string;
    struct Two_Node *Next;
};
struct One_Node {
    char *string;
    struct One_Node *Next;
    struct Two_Node *Two_Next;
};
int
insert_list( struct One_Node **RootP, char *one_str, char *two_str );
void
print_list( struct One_Node **RootP );



int
insert_list( struct One_Node **RootP, char *one_str, char *two_str )
{
    struct One_Node *Next_One_Node;
    struct One_Node *New_One_Node;

    struct Two_Node *Next_Two_Node;
    struct Two_Node *New_Two_Node;
    struct Two_Node **Two_Node_Root;
    
    while( ( Next_One_Node = *RootP ) != NULL && strcmp( Next_One_Node->string, one_str ) < 0 )
        RootP = &Next_One_Node->Next;//遍历一级链表
    
    if( Next_One_Node == NULL || strcmp( Next_One_Node->string, one_str ) != 0 )//如果不存在,则建立一个新的一级节点
    {
        New_One_Node = ( struct One_Node * )malloc( sizeof( struct One_Node ) );
        if ( New_One_Node == NULL )
            return 0;
        *RootP = New_One_Node;
        New_One_Node->Next = Next_One_Node;
        New_One_Node->string = strdup( one_str );
        New_One_Node->Two_Next = NULL;
    }
    
    Two_Node_Root = &(*RootP)->Two_Next;
    
    while ( ( Next_Two_Node = *Two_Node_Root ) != NULL && strcmp( Next_Two_Node->string, two_str ) <= 0)//遍历二级链表
    {
        if ( strcmp( Next_Two_Node->string, two_str ) == 0 )
                break;

        Two_Node_Root = &Next_Two_Node->Next;
    }
    
    New_Two_Node = ( struct Two_Node * )malloc( sizeof( struct Two_Node ) );//新建二级节点
    if ( New_Two_Node == NULL )
        return 0;
    *Two_Node_Root = New_Two_Node;
    New_Two_Node->Next = Next_Two_Node;
    New_Two_Node->string = strdup( two_str );
    
    return 1;
}


void
print_list( struct One_Node **RootP )
{
    struct One_Node *Next_One_Node;
    struct Two_Node *Next_Two_Node;
    
    
    while( ( Next_One_Node = *RootP ) != NULL )
    {
        for( Next_Two_Node = Next_One_Node->Two_Next; Next_Two_Node != NULL; Next_Two_Node = Next_Two_Node->Next )
                printf( "%s %s \n", Next_One_Node->string, Next_Two_Node->string );
        RootP = &Next_One_Node->Next;
    }
}





[此贴子已经被作者于2017-3-13 21:40编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-03-13 20:50
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
回复 15楼 renkejun1942
代码已收藏  满篇幅的链表指针  我看着都头疼  得闲时慢慢看  

DO IT YOURSELF !
2017-03-13 20:52
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 16楼 wp231957
我的这两个函数,被我一个程序员朋友直接吐槽,“下次你要再拿这么变态的代码,老子不看了。”

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-03-13 20:53
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
呵呵 你的变量名好记 神马 万 图 思锐 法哦 的  

DO IT YOURSELF !
2017-03-13 20:55
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:20 
库函数里的快排效率挺高的。

程序代码:
#include <stdio.h>
#include <stdlib.h>

#define MAX 100

typedef struct __tag_date
{
    short y;
    short m;
    short d;
} Date;

int cmp(const void *a, const void *b)
{
    Date *da = (Date *) a, *db = (Date *) b;
    if (da->y != db->y) return da->y - db->y;
    if (da->m != db->m) return da->m - db->m;
    return da->d - db->d;
}

int main()
{
    size_t n = 0;
    Date date[MAX];
    FILE *fp = fopen("../a.txt", "r");

    if (NULL == fp)
    {
        perror("Can't find file a.txt");
        exit(EXIT_FAILURE);
    }
    
    while (3 == fscanf(fp, "%hi%hi%hi", &date[n].m, &date[n].d, &date[n].y))
    {
        n++;
    }
    fclose(fp);

    qsort(date, n, sizeof(date[0]), cmp);

    for (size_t i = 0; i < n; ++i)
    {
        printf("%d    %d    %d\n", date[i].y, date[i].m, date[i].d);
    }
    return 0;
}


[fly]存在即是合理[/fly]
2017-03-14 09:25
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:20 
记得以前做个一贴生日排序的百分贴~不过没有收藏懒得找了~~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-03-14 10:04
快速回复:排序高手进来看看 关于字符串多重排序的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019589 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved