C //练习 6-3 编写一个交叉引用程序,打印文档中所有单词的列表,并且每个单词还有一个列表,记录出现过该单词的行号。对the、and等非实义单词不予考虑。

这篇具有很好参考价值的文章主要介绍了C //练习 6-3 编写一个交叉引用程序,打印文档中所有单词的列表,并且每个单词还有一个列表,记录出现过该单词的行号。对the、and等非实义单词不予考虑。。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C程序设计语言 (第二版) 练习 6-3

练习 6-3 编写一个交叉引用程序,打印文档中所有单词的列表,并且每个单词还有一个列表,记录出现过该单词的行号。对the、and等非实义单词不予考虑。

注意:代码在win32控制台运行,在不同的IDE环境下,有部分可能需要变更。
IDE工具:Visual Studio 2010

 文章来源地址https://www.toymoban.com/news/detail-805223.html

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

#define MAXWORD 100
#define BUFSIZE 100

char buf[BUFSIZE];
int bufp = 0;
long lineNumber = 1;

struct tnode{
    char *word;
    struct tnode *left;
    struct tnode *right;
    int count;
    long lineNumbers[];
};

int judge(char *s){
    int found = 0;
    int giveup = 0;

    char *list[] = {"a", "an", "and", "be", "but", "by", "he", "I", "is", "it", "of", "off", "on", "she", "so", "the", "they", "to", "you"};

    int top = sizeof list / sizeof list[0] - 1;
    int bottom = 0;
    int guess = top / 2;
    int diff = 0;

    if(s != NULL){
        while(!found && !giveup){
            diff = strcmp(list[guess], s);
            if(0 == diff){
                found = 1;
			}
			else if(0 < diff){
                top = guess - 1;
            }
			else{
                bottom = guess + 1;
            }

            if(top < bottom){
                giveup = 1;
            }
			else{
                guess = (top + bottom) / 2;
            }
        }
    }
    return found;
}

struct tnode *talloc(void) {
    return (struct tnode *) malloc(sizeof(struct tnode));
}

char *_strdup(char *s) {
    char *p;

    p = (char *) malloc(strlen(s) + 1);
    if (p != NULL)
        strcpy(p, s);
    return p;
}

struct tnode *addtree(struct tnode *p, char *w, long lineNumber) {
    int i, cond;

    if(p == NULL){
        p = talloc(); 
        p->word = _strdup(w);
        p->count = 1;
        p->lineNumbers[p->count - 1] = lineNumber;
        p-> left = p->right = NULL;
    }
	else{
        cond = strcmp(w, p->word);
        if(cond == 0){
            for(i = 0; i < p->count; i++){
                if(lineNumber == p->lineNumbers[i]){
                    return p;
				}
			}
            p->lineNumbers[p->count] = lineNumber;
            p->count += 1;
        }
		else if(cond < 0){
            p->left = addtree(p->left, w, lineNumber);
		}
        else{
            p->right = addtree(p->right, w, lineNumber);
		}
    }
    return p;
}

void treeprint(struct tnode *p) {
    int i;
    if(p != NULL){
        treeprint(p->left);

        if(p->count > 1 && strlen(p->word) > 1){
            printf("%12s:\t", p->word);
            for(i = 0; i < p->count; i++){
                printf("%lu%s", p->lineNumbers[i], (i == p->count - 1) ? "\n" : ", ");
			}
        }

        treeprint(p->right);
    }
}

int getch(void){
    return (bufp > 0) ? buf[--bufp] : getchar();
}

void ungetch(int c){
    if (bufp >= BUFSIZE){
        printf("ungetch: too many characters\n");
	}
    else{
        buf[bufp++] = c;
	}
}

int getword(char *word, int lim){
    int c;
    char *w = word;

    while(isspace(c = getch())){
        if (c == '\n'){
            lineNumber++;
		}
	}

    if(c != EOF){
        *w++ = c;
	}

    if(!isalpha(c)){
        *w = '\0';
        return c;
    }

    for(;--lim > 0; w++){
        if(!isalpha(*w = getch())){
            ungetch(*w);
            break;
		}
	}
    *w = '\0';
    return word[0];
}

int main(){
    struct tnode *root;
    char word[MAXWORD];

    root = NULL;
    while (getword(word, MAXWORD) != EOF){
        if (isalpha(word[0]) && !judge(word)){
            root = addtree(root, word, lineNumber);
		}
	}
    treeprint(root);

	system("pause");
    return 0;
}

到了这里,关于C //练习 6-3 编写一个交叉引用程序,打印文档中所有单词的列表,并且每个单词还有一个列表,记录出现过该单词的行号。对the、and等非实义单词不予考虑。的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • js编写一个函数判断所有数据类型

    一、编写一个函数判断所有数据类型的通用方法 1、typeof 在 JavaScript 里使用 typeof 来判断数据类型,只能区分基本类型,即 “number”,”string”,”undefined”,”boolean”,”object” 五种。 对于数组、对象来说,其关系错综复杂,使用 typeof 都会统一返回 “object” 字符串。

    2024年02月06日
    浏览(35)
  • 如何编写一个可变参数函数?如何让所有单片机的所有串口实现printf函数?

    (1)由于真的复习不下去,就想着写一篇博客拉回自己的心思。于是想到了长期有疑惑,但是一直没有进行深入了解的C语言可变参数函数。 (2)本人查阅了一些网上的资料,以及自己的理解写出来了这一片博客。首先再次感谢肯哥的答疑。 (3)借鉴文章: C51单片机中如何

    2024年02月11日
    浏览(33)
  • 使用js编写一个函数判断所有数据类型的通用方法

    一、判断数据类型的方法 1、typeof 在 JavaScript 里使用 typeof 来判断数据类型,只能区分基本类型,即 “number”,”string”,”undefined”,”boolean”,”object” 五种。 对于数组、对象来说,其关系错综复杂,使用 typeof 都会统一返回 “object” 字符串。 要想区别对象、数组单

    2024年02月22日
    浏览(39)
  • 编译原理——编写LEX文件:一个能识别所有运算式中包含的符号

    目录 题目 1.首先需要有一个flex.exe文件  2.在这个文件中写.l文件 3.win+r打开cmd命令 (1)进入flex.exe文件所在文件夹 (2)使用dir命令查看目录中的文件  4.生成lex.yy.c文件  5.生成lex.yy.exe文件  (1)点击文件—打开项目或文件 (2)选中lex.yy.c (3)然后编译运行 (4)生成.e

    2023年04月10日
    浏览(30)
  • 数据结构:编写程序用队列实现打印杨辉三角

              本文将通过完成用队列实现打印杨辉三角,代码解释标注全面而且清晰,代码书写也十分规范,适合初学者进行学习,本篇文章算是本人的一些学习记录分享,希望对有需要的小伙伴提供一些帮助~ 希望能帮助大家掌握: 掌握定义顺序队和链队的结点类型的方

    2024年02月06日
    浏览(36)
  • C //练习 6-5 编写函数undef,它将从由lookup和install维护的表中删除一个变量及其定义。

    练习 6-5 编写函数undef,它将从由lookup和install维护的表中删除一个变量及其定义。 注意:代码在win32控制台运行,在不同的IDE环境下,有部分可能需要变更。 IDE工具:Visual Studio 2010   代码块:

    2024年01月21日
    浏览(37)
  • C++ //练习 11.14 扩展你在11.2.1节练习(第378页)中编写的孩子姓到名的map,添加一个pair的vector,保存孩子的名和生日。

    练习 11.14 扩展你在11.2.1节练习(第378页)中编写的孩子姓到名的map,添加一个pair的vector,保存孩子的名和生日。 环境:Linux Ubuntu(云服务器) 工具:vim   代码块 运行结果显示如下

    2024年04月10日
    浏览(28)
  • 微信小程序多页面引用一个公共页

    这段时间在项目中遇到一个购物车的需求,tabBar页面需要购物车,在购物界面也要能跳转到购物车; 之前的做法是直接跳转到tabBar的购物车页面,但是这种跳转既不流畅,也不美观; 于是只能新建一个页面,做成和tabBar的购物车一样的,但是程序员都很懒,即使是复制一个

    2024年02月09日
    浏览(89)
  • python编写一个小程序,python入门小程序编写

    大家好,小编来为大家解答以下问题,python编写一个小程序,python入门小程序编写,现在让我们一起来看看吧! 大家好,小编为大家解答python简单易懂的小程序的问题。很多人还不知道python入门小程序编写,现在让我们一起来看看吧! 20个小段程序 1.字符串翻转 运行结果:

    2024年02月03日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包