您的位置:程序门 -> c/c++ ->



函数实现给用户分配顺序号


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


函数实现给用户分配顺序号
发表于:2007-07-27 09:24:01 楼主
是这样的,我想用c语言实现如下函数
int   get_unit_no(   void   *   info   )  
函数实现的功能大概是这样的:
分配顺序号unitno(4位十进制,1-9999),保证不重复,与送入的info指针对应起来,info指针即申请id的用户信息
成功返回id,失败返回0。
下边这个函数是用来实现查询用户信息的
viod   *   get_unit_info(   int   unit_no   )   ;
返回unitno对应的info指针,失败返回null。
发表于:2007-07-27 09:38:221楼 得分:0
给用户分配完id后,用要实现的第二个函数viod   *   get_unit_info(   int   unit_no   )可以查询出用户的信息
发表于:2007-07-27 09:39:142楼 得分:0
用一个static变量就可以了
发表于:2007-07-27 09:41:313楼 得分:0
struct
{
    int   unitno;
    void   *   info;
    ...                   //其他成员
};
int   maxunitno;       //全局辅助变量,记录当前unitno的最大值

int   get_unit_no(   void   *   info   )  
{
    if(maxunitno   >   9998)     //超出范围了,提示出错并返回0
    {
          fprintf(stderr,   "the   unitno   is   larger   than   9999.\n ");
          return   0;
    }
    maxunitno   +=   1;       //得到   unitno  
    return   maxunitno;
}
发表于:2007-07-27 09:41:584楼 得分:0
能说具体点吗
发表于:2007-07-27 09:42:505楼 得分:0
给用户分配完id后,用要实现的第二个函数viod   *   get_unit_info(   int   unit_no   )可以查询出用户的信息
=========
遍历你的记录,
其中记录使用结构体或者其他数据结构,
检查其中   unitno   域的值,
找到匹配的返回   对应的   info   域的内容即可。
发表于:2007-07-27 09:47:486楼 得分:0
谢谢jixingzhong
你定义的struct结构有什么作用?
里面包含有用户id?
这个用户id是我要分给用户的
发表于:2007-07-27 09:48:117楼 得分:0
对阿,   一般这个用散列表,   或者链表来实现既可

方法就是星辰说的那样。之需要遍历找到unitno相同的之后,返回对应的其他信息既可
发表于:2007-07-27 09:51:148楼 得分:0
在那样的结构体中的id   也可以分给用户阿,

你是打算怎么分呢?   随机分配还是?     按照什么来分配?

你要最先初始化的是info还是   id呢?
发表于:2007-07-27 09:51:479楼 得分:0
先定义一个结构如:
typedef       struct{    
                    int   unit_no;    
                    void   *   info;    
    }usr;

再创建一个数组usr   *   users;
然后实现那两个函数int   get_unit_no(   void   *   info   )   往数组里加内容
unit_no的产生可取最大值加1或随机产生判断唯一性

viod   *   get_unit_info(   int   unit_no   )取数组元素
发表于:2007-07-27 09:54:4910楼 得分:0
应该是随机分吧
发表于:2007-07-27 09:58:0411楼 得分:0
多谢各位!
哪位能给个具体实现吗?
发表于:2007-07-27 10:48:2412楼 得分:0
#include   <iostream>
#include   <map>
using   namespace   std;

struct   info
{
int   n;
};

map <int,info   *>   mapinfo;

int   get_unit_no(   info   *   info   )   ;
info   *   get_info(int   n);
int   get_unit_no(info   *   info)
{
int   n;
if(mapinfo.size()   >   9999)
n   =   0;
else   if(mapinfo.empty())
n   =   1;
else
{
map <int,info   *> ::iterator   itend=mapinfo.end();
itend   --;
n   =   itend-> first   +   1;
if(n   >   9999)
n   =   0;
}
if(   n   >   0   )
mapinfo[n]   =   info;
return   n;

}
info   *   get_info(int   n)
{
map <int,info   *> ::iterator   it;
it   =   mapinfo.find(n);
if(it   ==   mapinfo.end())
return   null;
return   it-> second;
}
main()
{
info   *   pinfo   =   new   info[200];
int   i,n;
for(   i   =   0   ;   i   <   200   ;   i   ++)
{
n   =   get_unit_no(&pinfo[i]);
}        
for(   i   =   1;   i   <=   200;   i   ++)
{
cout   < <   "info   id: "   < <   i   < <   ",info: "   < <   get_info(i)   < <   endl;
}
delete   []   pinfo;
mapinfo.clear();
}
发表于:2007-07-27 11:04:5013楼 得分:0
谢谢孤星飞雨!
不能用c++的东西
想用c实现,可以吗
发表于:2007-07-27 11:28:2814楼 得分:0
#include   <stdio.h>
#include   <stdlib.h>
#include   <string.h>
#define   minno   1
#define   maxno   9999


int   get_union_id(void   *   info);
void   *   get_info(int   n);

char   *   infotable[maxno-minno];
void   init();
void   init()
{
memset(infotable,0,sizeof(char*)   *   (maxno   -   minno));
}
int   get_union_id(void   *   info)
{
        int   i;
        for(   i   =   minno;   i   <=   maxno   ;   i++)
        {
if(!infotable[i   -   minno])
{
infotable[   i   -   minno]   =   (char   *)info;
break;
}
        }
      if(   i   > =   minno   &&   i   <=   maxno)
return   i;
      return   0;
}
void   *   get_info(int   n)
{
if(n   > =   minno   &&   n   <=   maxno)
return     infotable[n-minno];
}
main()
{
        int   i;
        int   *   pinfo   ;
        pinfo   =   (int   *)   malloc(200   *   sizeof(int));
        init();
        for(i   =   0   ;   i   <   200   ;   i   ++)
        {
            get_union_id(&pinfo[i]);
        }
      for(   i   =   1;   i   <=   200   ;   i   ++)
          printf( "infoid:%d,info:0x%08x\r\n ",i,get_info(i));
      free(pinfo);
}
发表于:2007-07-27 14:34:5315楼 得分:0
谢谢guxingfeiyu!

我想实现的第一个函数,希望能够随机的分配id给用户
另外,int   get_unit_no(   void   *   info   )函数入口提供的info主要代表的是申请id用户的身份标识
发表于:2007-07-27 15:49:4316楼 得分:0
随机的话就用c++的map。不然就是两个数组,一个是已经使用了的id,一个是未使用的id,在未使用的id数组中随机。
发表于:2007-07-27 15:53:5917楼 得分:0
可以用链表实现吗
发表于:2007-07-27 15:59:0718楼 得分:0
用链表保存什么信息?如何关联上你产生的随机数?数组更简单。
发表于:2007-07-27 16:12:3219楼 得分:0
用来保存申请者的id,其分配的顺序号
发表于:2007-07-27 17:15:4620楼 得分:0
哪位高人有别的见解
发表于:2007-07-27 17:20:5221楼 得分:0
#include   <stdio.h>
#include   <stdlib.h>
#include   <string.h>
#define   minno   1
#define   maxno   9999


int   get_union_id(void   *   info);
void   *   get_info(int   n);

char   *   infotable[maxno-minno];

int   pcanuseid[maxno   -   minno];
int   nleftidcount;

void   init();
void   init()
{
int   i;
for(   i   =   minno   ;   i   <=   maxno;   i   ++)
pcanuseid[   i   -   minno   ]   =   i;
nleftidcount   =   maxno   -   minno   +   1;
memset(infotable,0,sizeof(char*)   *   (maxno   -   minno));
}
int   get_union_id(void   *   info)
{
      int   n;
int   nid;
if(nleftidcount   <=   0)
return   0;
n   =   rand()   %   (nleftidcount   +   1);
nid   =   pcanuseid[n];
infotable[pcanuseid[n]   -   minno]   =   (char   *)info;
memcpy(pcanuseid   +   n,pcanuseid   +   n   +   1,sizeof(int)   *   (nleftidcount   -   n   -   1));
nleftidcount   --;
return   nid;
}
void   *   get_info(int   n)
{
if(n   > =   minno   &&   n   <=   maxno)
return     infotable[n-minno];
}
main()
{
        int   i;
        int   *   pinfo   ;
int   *   nids   =   (int   *)   malloc(200   *   sizeof(int));
        pinfo   =   (int   *)   malloc(200   *   sizeof(int));
        init();
        for(i   =   0   ;   i   <   200   ;   i   ++)
        {
            nids[i]   =   get_union_id(&pinfo[i]);
        }
      for(   i   =   0;   i   <   200   ;   i   ++)
          printf( "i:%d,infoid:%d,info:0x%08x\r\n ",i,nids[i   ],get_info(nids[i]));
    free(pinfo);
free(nids);
}
发表于:2007-07-27 18:23:5022楼 得分:0
建一个分配顺序号unitno与info指针的哈希表,然后实现
int   get_unit_no(   void   *   info   );
viod   *   get_unit_info(   int   unit_no   )   ;
发表于:2007-07-27 18:28:2923楼 得分:0
望给建议的好心人,能给个具体实现
发表于:2007-07-30 09:02:5124楼 得分:0
多谢各位了
一会散分
发表于:2007-07-30 09:07:5425楼 得分:0
蹭一会的分
发表于:2007-07-30 09:32:4826楼 得分:0

给的程序好像不满足要求啊

孤星飞雨给的程序,给用户分配完id后,假如下次有用户来申请id,我怎么知道还有哪些id可用?
怎么查询已分配用户的id?
发表于:2007-07-30 13:19:5427楼 得分:0
干什么要知道还有哪些id可用?怎么查询已分配用户的id?
========
get_union_id已经完成了这个工作。不需要额外的处理了。
发表于:2007-07-30 13:30:4928楼 得分:0
直接要代码?似乎有点。。。

等会给你一个实现,   现在有点忙


发表于:2007-07-30 14:01:2129楼 得分:0
thanks   softwarewander
发表于:2007-07-30 14:03:0330楼 得分:0
干什么要知道还有哪些id可用?

不知道的话,下次怎么给来申请的用户分配啊?
发表于:2007-07-30 14:09:0931楼 得分:0
get_uion_id已经分配了id了啊。你没看(懂)代码?你根本就不用管是不是还有id,分配成功地话get_union_id返回的就是1-9999中的数字,不成功则返回0。
你的意思是不是说下次有一个id(假如是1),你不知道这个id是否是有效的对吗?get_info返回null就是无效的。这个函数没有什么效率损失。
发表于:2007-07-30 14:13:5632楼 得分:0
我知道分配了
但我还要对分配id的用户进行管理,能够查询出已分配用户的id
得保证分配给每个用户得id不重复
发表于:2007-07-30 14:24:3933楼 得分:0
加个数组进去保存起来就可以了!!!
发表于:2007-07-30 15:12:4634楼 得分:0
softwarewander在吗?
帮帮忙吧
发表于:2007-07-30 15:34:1135楼 得分:0
#include   "stdio.h "
#define   table_capacity   10000  

typedef   struct   infors
{
int   no;     //id
char   name[10];   //姓名不应大于10个字符
struct   infors     *next;
}infors   *   pinfors;
pinfors   hashtable[table_capacity]={null};


int   hashvalue(int   id)//产生哈西值
{
return   id%10000;
}

void   hash_set(int   ikey,pinfors   p)     //设置哈西表
{
int   key;
key=hashvalue(ikey);
if(hashtable[key]==null)
{
hashtable[key]=p;
}
else       //如果第一次的哈西值相同(冲突),那么将后来的链入链表的最后面
{
pinfors   cur;
while((cur=hashtable[key]-> next)==null);
cur-> next=p;
}
}

int   init_infors(int   id,char   *   ps)
{
if(ps==null)
return   -1;

pinfors   p=(pinfors)malloc(sizof(pinfors));
if(p!=null)
{
p-> no=id;
strcpy(p-> name,ps);
p-> next=null;

hash_set(id,ps);
}
return   id;

}

void   init()
{
for(int   i=0;i <100000;i++)
{
char   *   pname=gets(stdin);
int   rs=init_infors(i,pname);
if(rs!==-1)
{
printf( "第   %d   个数据初始化失败\n ",i);
return;
}
}
}


//测试函数

int   get_unit_no(   void   *   info   )
{
pinfors   p=(pinfors)info;
return   p-> no;     //这里要保正   info指向的是真正的infors的数据结构,否则返回有可能出错,有可能是垃圾
}


viod   *   get_unit_info(   int   unit_no   )
{
int   index=hashvalue(unit_no);

if(hashtable[index]-> no==unit_no)
{
return   (void   *)hashtable[index];
}
else
{
pinfors   cp=hashtable[index];
for(;cp-> next!=null;cp=cp-> next)
{
if(cp-> no==unit_no)
return   (void   *)cp;
}
}
}

int   main(int   argc,   _tchar*   argv[])
{
init();
return   0;
}
发表于:2007-07-30 15:41:1336楼 得分:0
随手写的,   运行了一下,还有很多错误.赫赫
#include   "stdio.h "
#define   table_capacity   10000  

typedef   struct   infors
{
int   no;     //id
char   name[10];   //姓名不应大于10个字符
struct   infors     *next;
}infors,   *   pinfors;

pinfors   hashtable[table_capacity]={null};


int   hashvalue(int   id)//产生哈西值
{
return   id%10000;
}

void   hash_set(int   ikey,pinfors   p)     //设置哈西表
{
int   key;
key=hashvalue(ikey);
if(hashtable[key]==null)
{
hashtable[key]=p;
}
else       //如果第一次的哈西值相同(冲突),那么将后来的链入链表的最后面
{
pinfors   cur;
while((cur=hashtable[key]-> next)==null);
cur-> next=p;
}
}

int   init_infors(int   id,char   *   ps)
{
if(ps==null)
return   -1;

pinfors   p=(pinfors)malloc(sizeof(infors));
if(p!=null)
{
p-> no=id;
strcpy(p-> name,ps);
p-> next=null;

hash_set(id,p);
}
return   id;

}

void   init()
{
for(int   i=0;i <100000;i++)
{
char   *   pname=gets((char   *)stdin);
int   rs=init_infors(i,pname);
if(rs==-1)
{
printf( "第   %d   个数据初始化失败\n ",i);
return;
}
}
}


//测试函数

int   get_unit_no(   void   *   info   )
{
pinfors   p=(pinfors)info;
return   p-> no;     //这里要保正   info指向的是真正的infors的数据结构,否则返回有可能出错,有可能是垃圾
}


void   *   get_unit_info(int   unit_no)
{
int   index=hashvalue(unit_no);

if(hashtable[index]-> no==unit_no)
{
return   (void   *)hashtable[index];
}
else
{
pinfors   cp=hashtable[index];
for(;cp-> next!=null;cp=cp-> next)
{
if(cp-> no==unit_no)
return   (void   *)cp;
}
}
}

int   main(int   argc,   _tchar*   argv[])
{
init();
return   0;
}


发表于:2007-07-30 15:44:0137楼 得分:0
多谢softwarewander
辛苦了
发表于:2007-07-30 15:44:5738楼 得分:0
这次的是没有问题的,

我先开始初始化了10w个结构体,(赫赫   可以少一点)   然后将这些存储在1w个大小的哈希表中.(当然可以更小如1k之类的,这就需要一个很好的哈希函数了)

然后设置哈西表,     不过主要是以id为键值的.
你可以测试一下,那两个函数,
发表于:2007-07-30 15:57:1139楼 得分:0

建议将table_capacity改成10

然后init将改成这样
void   init()
{
char   *   buf[10]={0};

for(int   i=0;i <15;i++)
{
printf( "请输入\n ");
char   *   pname=gets((char   *)buf);
int   rs=init_infors(i,pname);
if(rs==-1)
{
printf( "第   %d   个数据初始化失败\n ",i);
return;
}
}
}

大概知道我的思路就可以了


快速检索

最新资讯
热门点击