建立一棵二叉树,每个接单存放单词以及指向一个链表的指针,以及指向左右节点的指针。链表内存放行号以及指向下一个链表节点的指针。

每录入一个单词,先寻找二叉树,再寻找它的链表,分别将单词和行号插入二叉树和链表,这样,每一个单词自然就有一个属于它的行号链表。

最后打印。

代码如下:

 #include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h> #define MAXWORD 100
#define MAXHANG 10000 extern int getword(char *word, int lim);
struct hang *hes(struct hes *, int); /* 链表hang,每个节点存放行数及一个指向下一个行的指针 */
struct ci *cc(struct ci *, char *, int);/* 二叉树ci,每个节点存放一个单词以及一个指向链表hang的指针 */
void hesprint(struct hes *); /* 打印链表 */
void ccprint(struct cc *); /* 打印二叉树 */
struct hang *talloc(void); /* 为树cc申请储存空间 */
struct ci *atalloc(void); /* 为树cc申请储存空间 */
char *strduper(char *s); /* word存放在一个安全的地方 */
int exclude(char *); struct hang {
int x;
struct hang *next;
}; struct ci {
char *word;
struct hang *hangg;
struct ci *left;
struct ci *right;
}; /* 编写程序,打印文本中的所有单词,并且打印每个单词出现的行号,is,to等非实意单词不考虑 */
main() {
struct ci *root;
char word[MAXWORD];
int hangs; root=NULL; while((hangs=getword(word,MAXWORD))!=EOF) /* getword返回行号 */
if((isalpha(word[])||word[]=='_')&&!exclude(word)) /* 函数exclude确认单词是否可以被忽略 */
root=cc(root,word,hangs);
ccprint(root);
return ;
}
struct ci *cc(struct ci *p, char *w, int x) {
int cond; if(p==NULL) {
p=atalloc();
p->word=strduper(w);
p->hangg=NULL;
p->hangg=hes(p->hangg,x);
p->left=p->right=NULL; } else if ((cond= strcmp(w,p->word))==)
p->hangg=hes(p->hangg,x);
else if (cond <)
p->left=cc(p->left,w,x);
else
p->right=cc(p->right,w,x);
return p;
} struct hang *hes(struct hang *p, int x) { if(p==NULL) {
p=talloc();
p->x=x;
p->next=NULL;
} else if (p->x==x)
;
else if (p->x!=x)
p->next=hes(p->next,x);
return p; } struct hang *talloc(void) {
return (struct hang *) malloc(sizeof(struct hang)); }
struct ci *atalloc(void) {
return (struct ci *) malloc(sizeof(struct ci));
}
char *strduper(char *s) {
char *p; p=(char *)malloc(strlen(s)+);
if(p!=NULL)
strcpy(p,s);
return p;
} void hesprint(struct hang *p) {
if(p!=NULL) {
printf("%4d ",p->x);
hesprint(p->next);
}
}
void ccprint(struct ci *p) {
if(p!=NULL)
{
ccprint(p->left);
printf("%s ",p->word);
hesprint(p->hangg);
printf("\n");
ccprint(p->right);
} } int exclude(char *s) {
static char *ex[]={
"a",
"an",
"and",
"are",
"in",
"is",
"of",
"or",
"that",
"the",
"this",
"to"
};
int cond,mid;
int low=;
int high=sizeof(ex)/sizeof(char *)-; while(low<=high) {
mid=(low+high)/;
if((cond=strcmp(s,ex[mid]))==)
return ;
else if(cond<)
high=mid-; else if(cond>)
low=mid+; }
return ;
}

打印文本中的所有单词,并且打印每个单词出现的行号,非实义单词不考虑(TCPL,练习6-3)的更多相关文章

  1. Lua中如何实现类似gdb的断点调试—06断点行号检查与自动修正

    前面两篇我们对性能做了一个优化,接下来继续来丰富调试器的特性. 我们前面提到过,函数内并不是所有行都是有效行,空行和注释行就不是有效行.我们之前在添加断点的时候,并没有对行号进行检查,任何行号都能成功 ...

  2. EXTJS4.2 内存中操作表格数据时,删除表格数据,行号不连续解决

    需要重新刷新下表格的view => grid.view.refresh();

  3. linux中python配置tab=4个空格,并显示行号。

    vim ~/.vimrc 写入: set ts=4 set nu :wq 保存. source ~/.vimrc 使之生效.

  4. Perl-统计文本中各个单词出现的次数(NVDIA2019笔试)

    1.原题 2.perl脚本 print "================ Method 1=====================\n"; open IN,'<','an ...

  5. Python中输入和输出(打印)数据

    一个程序要进行交互,就需要进行输入,进行输入→处理→输出的过程.所以就需要用到输入和输出功能.同样的,在Python中,怎么实现输入和输出? Python3中的输入方式: Python提供了 inpu ...

  6. vue项目中使用Lodop实现批量打印html页面和pdf文件

    1.Lodop是什么? Lodop(标音:劳道谱,俗称:露肚皮)是专业WEB控件,用它既可裁剪输出页面内容,又可用程序代码直接实现复杂打印.控件功能强大,却简单易用,所有调用如同JavaScript扩 ...

  7. CODESOFT中怎样打印数据库中的特定数据?

      CODESOFT可用于打印.标记和跟踪的零售库存标签软件,每种产品的售卖都代表着需要打印大量的条码标签.通常我们采用的方法就是在CODESOFT连接数据库批量打 印.但是如果数据量很大,该如何选择 ...

  8. js打印Iframe中的内容,并且不需要预览。

    js打印Iframe中的内容,并且不需要预览 js代码如下: <script type="text/javascript" language="Javascript ...

  9. 【译】 AWK教程指南 3计算并打印文件中指定的字段数据

    awk 处理数据时,它会自动从数据文件中一次读取一条记录,并会将该记录切分成一个个的字段:程序中可使用 $1, $2,... 直接取得各个字段的内容.这个特色让使用者易于用 awk 编写 reform ...

随机推荐

  1. Coursera Machine Learning : Regression 简单回归

    简单回归 这里以房价预测作为例子来说明:这里有一批关于房屋销售记录的历史数据,知道房价和房子的大小.接下来就根据房子的大小来预测下房价. 简单线性回归,如下图所示,找到一条线,大体描述了历史数据的走势 ...

  2. Android开发学习---sharedpreference的使用

    在前面文章中,为了使数据回显,使用的技术思路是,首先,将数据持久化写到ROM或者SDCard中,其中name和password以":"分隔;然后,将数据记取出来,再用split方法 ...

  3. easyui 使用问题积累

    一.<a>标签中onclick和javascript事件与grid的select事件执行的先后顺序 html: <a href='javascript:func();' onclic ...

  4. MD5编码的内存泄露

    MD5CryptoServiceProvider 如果多次使用会产生内存溢出,如下这样调用几百万次就会出现内存 溢出. public static string MD5Encode(string so ...

  5. c++ 覆盖、重载与隐藏

    成员函数被重载的特征:(1)相同的范围(在同一个类中):(2)函数名字相同:(3)参数不同:(4)virtual 关键字可有可无.覆盖是指派生类函数覆盖基类函数,特征是:(1)不同的范围(分别位于派生 ...

  6. 影响google PageRank的因素

    1 与pr高的网站做链接: 2 内容质量高的网站链接 3 加入搜索引擎分类目录 4 加入免费开源目录 5 你的链接出现在流量大.知名度高.频繁更新的重要网站上 6 google对PDF格式的文件比较看 ...

  7. js动态生成二维码图片

    1.html代码 <div id="qrcode" style="width:200px; height:200px;position: fixed;bottom: ...

  8. C# 解析 Json

    C# 解析 json JSON(全称为JavaScript Object Notation) 是一种轻量级的数据交换格式.它是基于JavaScript语法标准的一个子集. JSON采用完全独立于语言的 ...

  9. ASP数组全集,多维数组和一维数组[转]

    ASP数组是比较好用的装载大量数据的容器.1 定义数组 有两种方式:DIM和REDIM. DIM定义的是固定个数.数据类型的数组:而REDIM则不同,它可以定义不同类型的数据,也可以定义个数并非固定的 ...

  10. Asp.net Mvc 身份验证、异常处理、权限验证(拦截器)实现代码

    本问主要介绍asp.net的身份验证机制及asp.net MVC拦截器在项目中的运用.现在让我们来模拟一个简单的流程:用户登录>权限验证>异常处理 1.用户登录 验证用户是否登录成功步骤直 ...