排序,插入问题!

旭阳 2003-08-30 05:03:54
unix下开发
struct eg
{
char key1[4+1]; //最多8个
char date[8+1]; //最多31
char route[8+1]; //最多6000
char errcode[3+1]; //最多25
char errcause[3+1];//最多未知
int num;
}

这是一个扫描程序,
这个结构前五项可以唯一确定一值,如果在程序运行中再发现有前五项相同的,则num+1, 如果有新的五项内容,则再新添一个。


如果用结构存储,则不可能每次发现有表的五项唯一值后再realloc一次,需要首先分配一个最大值
malloc(MAX sizeof(struct eg));
而这个分配是不太可能的,因为太大,不能够分配。
即便是能够分配,而每次插入一项新内容后,需要再排序一下以方便下一次检索,这也比较麻烦。

请求哪位朋友有好的主意?

谢谢!
...全文
92 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
skywater 2003-09-01
  • 打赏
  • 举报
回复
但是我觉得在数据结构中,“快速插入”和“快速检索”是一对矛盾呀!如果能够“快速插入”的话,那么必然在检索上有所损失;如果要求“快速检索”,在编辑上必有所损失。

当然,如果用哈希表的话,性能可能比用链表好一点,但是哈希函数可能不好设计。
旭阳 2003-09-01
  • 打赏
  • 举报
回复
首先多谢楼上真诚的帮助!而使用链表不是我的初衷
我希望能够:
1:快速插入
2:快速检索

而链表插入方便,检索只能够顺序查找,如果这个链表非常长,则可能查找时间会较长了?
skywater 2003-08-31
  • 打赏
  • 举报
回复
用链表来实现。
首先创建一个节点:
struct node
{
struct eg a_eg;//存储数据的结构
struct eg *next;//下一个节点
};

struct list
{
struct node *head;//链表中的头节点。
long count;//节点的数目
};
有如下几个操作函数:
1.
int insert_into_list(struct list *a_list, struct eg *a_eg);//主要功能是将节点a_eg插入list中适合的位置,需要在list中循环比较每一个节点。插入成功后返回0,如果list中已经有相同的节点,返回1。
2、
int compare_eg(struct eg *old_eg, struct eg *new_eg)//比较两个节点的值,如果大于返回1,小于返回-1, 相等返回0.

实现过程:
1、首先分配一个struct eg,用于扫描
2、然后将扫描到的struct eg调用insert_into_list,将新节点按照顺序插入链表中。
3、如果第2步返回1,则调用free,将内存释放。


insert_into_list的实现过程:
1、从list的头节点head开始循环,每一个节点调用compare_eg进行比较,如果相同,返回1,否则进行下去。
2、比较到第n个节点的时候,compare_eg的返回值是-1,第n+1个节点的时候,返回值是1,那么n就是新节点要插入的位置。

大体上的设计是这个样子,当然细节问题还要多多考虑才成。
你觉得如何?
dddd8888 2003-08-31
  • 打赏
  • 举报
回复
stl
ZhangYv 2003-08-31
  • 打赏
  • 举报
回复
综合链表和数组优点的存储结构叫“块链”,找找讲“字符串”的数据结构章节看看有没有说到。它实际上是:链表的元素为数组,同时也要考虑到分块大小的问题。
旭阳 2003-08-31
  • 打赏
  • 举报
回复
谢谢楼上,还有好有意见吗?
idontlikenickname 2003-08-30
  • 打赏
  • 举报
回复


出个馊主意:
你可以用链表把这些结构的数据存储起来,同时你建一个指针数组(可以是固定大小的以可以是动态分配的),数组的每一个元素都是一个指向struct eg结构的指针,用来记录链表的每个节点的地址,这样你就可以顺序检索了,不过你要在插入新的结构节点时还要移动指针数组中的数据,还是有点麻烦~
另外你可以去看看数据结构中的一种综合链表和数组优点的存储结构,具体名字忘了~~

旭阳 2003-08-30
  • 打赏
  • 举报
回复
我是在unix下用c开发的,不是c++,
链表似乎不妥了,插入容易,但是检索时要顺序检索,如果太多就不好了。
lemonutzf 2003-08-30
  • 打赏
  • 举报
回复

方法 1。 用 STL 中的 vector
方法 2。 如果这个结构可以改变的话,可以把它改成链表。
如果不能改变,就把它封装起来,做成链表。

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧