每一行存储个数相同的字符串,行与行之间根据单词长度从大到小。
存储结构是个二维链表。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 100
struct RowNode
{
char str[SIZE];
RowNode* next;
};
struct ORNode
{
int strLen;
RowNode* rowHead;
ORNode* next;
};
void InitRowNode(RowNode* & node)
{
memset(node->str, 0, SIZE);
node->next = NULL;
}
void InitORNode(ORNode* & node)
{
node->strLen = 0;
node->rowHead = NULL;
node->next = NULL;
}
/*
** 插入新单词
*/
void InsertWord(ORNode* & head, char* word)
{
// 查找列
ORNode* pLine = NULL;
ORNode* preLine = NULL;
ORNode* newLine = NULL;
RowNode* pRow = NULL;
RowNode* preNode = NULL;
RowNode* pNode = (RowNode*)malloc( sizeof(RowNode) );
InitRowNode(pNode);
strcpy(pNode->str, word);
for (pLine = head; pLine && (strlen(word)>pLine->strLen) ; preLine = pLine, pLine = pLine->next)
;
// pLine ==NULL时候:head为NULL 或者 word长度小于所有行的长度
if ( pLine==NULL || strlen(word)<pLine->strLen ) // 新建一行插入
{
newLine = (ORNode*)malloc( sizeof(ORNode) );
InitORNode(newLine);
newLine->strLen = strlen(word);
newLine->rowHead = pNode;
if (preLine==NULL) // 直接插在头结点位置
{
newLine->next = head;
head = newLine;
}
else // 插入preLine后一行
{
newLine->next = preLine->next;
preLine->next = newLine;
}
}
else // 插入pLine指向的行
{
// pLine->rowHead为当前行
// 把word按照字典顺序插入该行
for (pRow = pLine->rowHead; pRow; preNode = pRow, pRow = pRow->next)
{
if ( strcmp(word, pRow->str)<0 )
break;
}
if (preNode==NULL) // 插入头部
{
pNode->next = pLine->rowHead;
pLine->rowHead = pNode;
}
else // 插入preNode的后面
{
pNode->next = preNode->next;
preNode->next = pNode;
}
}
}
/*
** 按行打印单词
*/
void PrintWordsByLine(ORNode* head)
{
ORNode* pIter = head;
RowNode* pRowIter = NULL;
while (pIter)
{
printf( "word of %d letter(s) :\n", pIter->strLen);
pRowIter = pIter->rowHead;
while (pRowIter)
{
printf("%s\n", pRowIter->str);
pRowIter = pRowIter->next;
}
pIter = pIter->next;
}
}
/*
** 销毁十字链表
*/
void DestroyOrthoList(ORNode* &head)
{
ORNode* pIter = head;
ORNode* pWork = NULL;
RowNode* pRowIter = NULL;
RowNode* pRowWork = NULL;
while (pIter)
{
// 销毁行
pRowIter = pIter->rowHead;
while (pRowIter)
{
pRowWork = pRowIter;
pRowIter = pRowIter->next;
free(pRowWork);
pRowWork = NULL;
}
// 销毁该结点
pWork = pIter;
pIter = pIter->next;
free(pWork);
pWork = NULL;
}
}
int main()
{
FILE* fp = fopen("input.txt", "r+");
if (fp==NULL)
exit(0);
ORNode* head = NULL;
int count=0;
char str[SIZE];
memset(str, 0, SIZE);
while ( fscanf(fp, "%s", str)==1 )
{
InsertWord(head, str);
++count;
memset(str, 0, SIZE);
}
PrintWordsByLine(head);
DestroyOrthoList(head);
fclose(fp);
system("PAUSE");
return 0;
}
测试文件内容 input.txt:
void PrintWordsByLine(ORNode* head)
{
ORNode* pIter = head;
RowNode* pRowIter = NULL;
while (pIter)
{
printf( "word of %d letter(s) :\n", pIter->strLen);
pRowIter = pIter->rowHead;
while (pRowIter)
{
printf("%s\n", pRowIter->str);
pRowIter = pRowIter->next;
}
pIter = pIter->next;
}
}
统计PrintWordsByLine函数这段代码,输出结果:
word of 1 letter(s) :
=
=
=
=
=
{
{
{
}
}
}
word of 2 letter(s) :
%d
of
word of 4 letter(s) :
void
word of 5 letter(s) :
"word
:\n",
NULL;
head)
head;
pIter
pIter
while
while
word of 7 letter(s) :
(pIter)
ORNode*
printf(
word of 8 letter(s) :
RowNode*
pRowIter
pRowIter
pRowIter
word of 9 letter(s) :
letter(s)
word of 10 letter(s) :
(pRowIter)
word of 12 letter(s) :
pIter->next;
word of 14 letter(s) :
printf("%s\n",
word of 15 letter(s) :
pIter->rowHead;
pIter->strLen);
pRowIter->next;
pRowIter->str);
word of 24 letter(s) :
PrintWordsByLine(ORNode*
请按任意键继续. . .
示例存储结构图:
同时 参见之前一篇blog 基于C++的十字链表实现:http://blog.youkuaiyun.com/dizuo/article/details/6361077