| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6687 人关注过本帖
标题:出个小题 活跃下论坛气氛
只看楼主 加入收藏
cgaa1
Rank: 2
来 自:uestc
等 级:论坛游民
帖 子:52
专家分:64
注 册:2009-4-11
收藏
得分:0 
不能用strcmp()函数,因为strcmp函数在遇到\0时会自动停止检测,这就造成1234和1相等的错误结果。
2009-08-24 21:06
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
程序代码:
for (i = 0; a[i] == b[i]; i++)  
  if (a[i] == 0)     
   return 0;
return a[i] - b[i]; 

我就是真命天子,顺我者生,逆我者死!
2009-08-24 21:17
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
#include <stdio.h>
#include <string.h>
int main(void)
{
    printf("%d", strcmp("1", "1234"));
    return 0;
}

我就是真命天子,顺我者生,逆我者死!
2009-08-24 21:26
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
我把题目标准化了
欢迎参与讨论  共同学习

我就是真命天子,顺我者生,逆我者死!
2009-08-24 22:01
cgaa1
Rank: 2
来 自:uestc
等 级:论坛游民
帖 子:52
专家分:64
注 册:2009-4-11
收藏
得分:0 
通过tc再次编程,证明我刚才那个论述是错的。对此,我收回刚才那句话
2009-08-24 22:05
wsj3000
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:78
专家分:161
注 册:2009-8-4
收藏
得分:0 
这是一个二叉树的题目,我刚做完练习,哈哈,就程序有些长,大家看下。。。。。在楼下。写了二叉树的头文件和实现;大家测试下。
tree.h文件
程序代码:
//tree.h
#ifndef _tree_h_
#define _tree_h_
#include <stdbool.h>

//struct tree
#define MAXCHARR 100

typedef struct treeitem{
    char charr[MAXCHARR];
    int count;
}TreeItem;

#define MAXTREEITEMS 1000

typedef struct treenode{
    TreeItem item;
    struct treenode * left;
    struct treenode * right;
}TreeNode;

typedef struct tree{
    TreeNode * root;
    int total;
}Tree;

//function declear

bool InitializeTree(Tree * *pptree);

bool TreeIsFull(const Tree * ptree);

bool TreeIsEmpty(const Tree * ptree);

int TreeItemCount(const Tree * ptree);

bool AddTreeItem(const TreeItem * pitem,Tree * ptree);

int InTree(const TreeItem * pitem,const Tree * ptree);

bool DeleteTreeItem(const TreeItem * pitem,Tree * ptree);

TreeItem MakeTreeItem(const char * pchar);

//bool TraverseTree(const TreeTree * ptree,bool (* pfun)(TreeItem * pitem));

//bool EmptyTree(Tree * ptree);

#endif
 

 tree.c文件,二叉树的实现文件。
程序代码:
//tree.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "tree.h"
//=======================================================================
//local struct
//result=[0,1] as [false,true]  position=[-1,0,1] as [left,itself,right]
typedef struct pair{
    TreeNode * parent;
    TreeNode * child;
    bool result;
    int position;
}Pair;
//local function delear
static TreeNode * MakeTreeNode(const TreeItem * pitem);
static int ToWhere(const TreeItem * pitem1,const TreeItem * pitem2);
static bool AddTreeNode(TreeNode * pnode,TreeNode * pparent,int position);
static Pair SeekTreeItem(const TreeItem * pitem,const Tree * ptree);
//--------------------------------------------------------------------------
//local function
static TreeNode * MakeTreeNode(const TreeItem * pitem)
{
    TreeNode * tpnode = NULL;
    tpnode = (TreeNode *)malloc(sizeof(TreeNode));
    if(tpnode!=NULL)
    {
        tpnode->item=*pitem;
        tpnode->item.count=1;
        tpnode->left=NULL;
        tpnode->right=NULL;
    }
    else
        fprintf(stderr,"MakeTreeNode() failed because malloc memory failed!");
       
    return tpnode;
}
static int ToWhere(const TreeItem * pitem1,const TreeItem * pitem2)
{
    return strcmp(pitem1->charr,pitem2->charr);
}
static bool AddTreeNode(TreeNode * pnode,TreeNode * pparent,int position)
{
    if(position==-1)
    {
        pparent->left=pnode;
        return true;
    }
    else if(position==1)
    {
        pparent->right=pnode;
        return true;
    }
    else if(position==0)
    {
        ((Tree *)pparent)->root=pnode;
        return true;
    }
    else
    {
        fprintf(stderr,"Error!AddTreeNode() failed! because parameter position=%d is not in [-1,0,1]!",position);
        return false;
    }
}

static Pair SeekTreeItem(const TreeItem * pitem,const Tree * ptree)
{
    Pair look;
    look.parent=(TreeNode *)ptree;
    look.child=ptree->root;
    look.result=false;
    look.position=0;
   
    while(look.child!=NULL)
    {
        if(ToWhere(pitem,&(look.child->item)) < 0)
        {
            look.parent=look.child;
            look.child=look.child->left;
            look.position=-1;
        }
        else if(ToWhere(pitem,&(look.child->item)) > 0)
        {
            look.parent=look.child;
            look.child=look.child->right;
            look.position=1;
        }
        else if(ToWhere(pitem,&(look.child->item)) == 0)
        {
            look.result=true;
            break;
        }
    }
    return look;
}
//=============================================================================
//function by tree.h
bool InitializeTree(Tree * *pptree)
{
    *pptree=(Tree *)malloc(sizeof(Tree));
    if(*pptree!=NULL)
    {
        (*pptree)->root=NULL;
        (*pptree)->total=0;
        return true;
    }
    else
        return false;
}
//
bool TreeIsFull(const Tree * ptree)
{
    return (ptree->total<MAXTREEITEMS)?false:true;
}
//
bool TreeIsEmpty(const Tree * ptree)
{
    return (ptree->total==0)?true:false;
}
//
int TreeItemCount(const Tree * ptree)
{
    return ptree->total;
}
//
bool AddTreeItem(const TreeItem * pitem,Tree * ptree)
{
    if(TreeIsFull(ptree))
    {
        fprintf(stderr,"AddTreeItem() failed!tree is full!");
        return false;
    }
       
    Pair look=SeekTreeItem(pitem,ptree);
    if(look.result)
    {
        (look.child->item).count++;
        return true;
    }
    else if(!look.result)
    {
        TreeNode * pnode=MakeTreeNode(pitem);
        return AddTreeNode(pnode,look.parent,look.position);
    }
}
//
int InTree(const TreeItem * pitem,const Tree * ptree)
{
    Pair look=SeekTreeItem(pitem,ptree);
    return look.result?look.child->item.count:0;
}
//
bool DeleteTreeItem(const TreeItem * pitem,Tree * ptree)
{
    Pair look=SeekTreeItem(pitem,ptree);
    if(look.result)
    {
        TreeNode * tpnode=NULL;
        for(tpnode=(look.child->left)->right;tpnode == NULL;tpnode=tpnode->right)
            continue;
        tpnode=look.child->right;
        if(look.position==-1 || look.position==1)
            look.parent->left=look.child->left;
        else if(look.position==0)
            ptree->root=look.child->left;
        else
        {
            fprintf(stderr,"DeleteTreeItem failed because look.position=%d is not in [-1,0,1]!",look.position);
            return false;
        }
        free(look.child);
        return true;
    }
    else
    {
        fprintf(stderr,"DeleteTreeItem() failed,not found this item!");
        return false;
    }
}
//
TreeItem MakeTreeItem(const char * pchar)
{
    TreeItem titem;
    int i;
    char ch;
    for(i=0;(ch=*(pchar+i))!='\0';i++)
        titem.charr[i]=ch;
    titem.charr[i]='\0';
    titem.count=1;
    return titem;
}
//
//bool TraverseTree(const TreeTree * ptree,bool (* pfun)(TreeItem * pitem));
//
//bool EmptyTree(Tree * ptree);



哈哈,欢迎指正,遍历二叉树的代码还没有写,正研究;个人比较得意的函数是SeekTreeItem,他的作用是查找树中有没有某个项目,如果有可以返回这个项目的位置,若没有则可以返回查找项目应该在的位置。
请大家测试~~~~~
2009-08-24 22:23
wsj3000
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:78
专家分:161
注 册:2009-8-4
收藏
得分:0 

这个是楼上二叉树的测试文件;以前写的不是读取文件;而是输入一大段字符串,空格或者回车隔开就可以了。然后,输入要查找的单词(字符串),显示出现的次数。
代码如下,大家可以自己改更读写文件的:

程序代码:
//testtree.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "tree.h"

int main()
{
    printf("Please enter the strings to count:\n");
    Tree * tptree;
    InitializeTree(&tptree);
    TreeItem titem;
    char * pch;
    while(scanf("%s",pch),strcmp(pch,"!!"))
    {
        titem=MakeTreeItem(pch);
        AddTreeItem(&titem,tptree);
    }
    printf("Which word you want to find?\n");
    scanf("%s",pch);
    titem=MakeTreeItem(pch);
    printf("%d",InTree(&titem,tptree));
    return 0;
}

2009-08-24 22:30
wsj3000
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:78
专家分:161
注 册:2009-8-4
收藏
得分:0 
对啦,上面测试程序,结束字符无输入要用 !! 才行,而且支持英语的字符串统计。
2009-08-24 22:38
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
不平衡,面对特殊数据会出问题。

专心编程………
飞燕算法初级群:3996098
我的Blog
2009-08-25 09:56
wxjeacen
Rank: 7Rank: 7Rank: 7
等 级:禁止访问
帖 子:1291
专家分:628
注 册:2009-3-22
收藏
得分:0 
递归写了个。。。
wxjeacen@wxjeacen-laptop:~/linux/test_c++$ ./outcome <in.dat
abcde    4
abc    4
aabbc    2
wxjeacen@wxjeacen-laptop:~/linux/test_c++$


[ 本帖最后由 wxjeacen 于 2009-8-25 11:00 编辑 ]

test_c++.tar.gz (191.66 KB)

生命不熄,战斗不止.
2009-08-25 10:58
快速回复:出个小题 活跃下论坛气氛
数据加载中...
 
   



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

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