回复 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 我有预感,要发芽了。
程序代码:#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编辑过]

程序代码:
/*用一个链表将多个链表连起来*/
/* 二级链表 */
#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编辑过]

程序代码:#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;
}
