设为首页 加入收藏

TOP

C语言去掉字符串集合重复元素(一)
2013-09-24 09:23:24 来源: 作者: 【 】 浏览:965
Tags:语言 去掉 字符串 集合 重复 元素

  有一种最直接的方法可以去掉一个集合中重复的元素,这种方法据说就是“交给下面去做”,然而有时候,你自己动手去做一下也是不错的。如果交给下面去做,最直接的选择就是使用map,在java中,我们有HashMap,TreeMap等等实现了map接口的类可用,c++中,同样有STL的同类集合可以使用,在各类高级语言中,就更不必说了,然而在c中,就没有那么幸运了,很多东西需要你来自己实现。

  用c语言自行实现这个东西,其实对于软件工程而言没有必要,然而可以训练一下自己,增加一些内力。我不认为自己是个高手,更非大侠,然而因为我懂得少,只能自己重新来做,真恨自己没有在5年前多学习一些编程(www.cppentry.com)语言。

  先来简单分析一下需求,就是一个字符串集合中,去掉重复的字符串,换句话说就是每一个字符串只保留一个。题目没有说是否保持原有的字符串输入顺序,作为完美主义的我,我还是将其当成了一个隐含的需求。那么下一步就是将问题进行简化和转化,如果我们能将这一堆字符串进行排序,那么最终遍历这个排过序的字符串集合,发现和前一个相同的字符串就跳过不输出,对于排序,再简单不过了,至少N中排序算法,本文不讨论各种排序算法,只使用最简单的冒泡排序来分析。那么怎么保留原有的输入序呢?这也很简单,就是在排序元素中增加一个指向原有序的指针即可,另外还有一种方法,那就是排序过程仅仅是一个删除重复元素的过程,而不影响原有的输入序列,这个动态行为可以用二叉树的插入来实现,或者其它的AVL树以及红黑树都可以,本文不会去谈这几棵树的特性,只是用最简单的排序二叉树来分析。

  我们知道,在二叉树插入中,首先要进行一次查找,现在要做的是,如果没有找到相同的,则插入,如果找到了相同的,则不插入,同时为该元素置入删除标识。代码如下:

  //

  //  main.c

  //  dup-del

  //

  //  Created by ya zhao on 11-12-17.

  //  Copyright 2011年 __MyCompanyName__. All rights reserved.

  //

  #include <stdio.h>

  #include <stdlib.h>

  struct sorted_order_str_map_with_thread {

  char *sorted_order_str;  //保存排序后的字符串

  char *normal_order_str;  //保存原始字符串

  int tag;                //指示是否要删除

  struct sorted_order_str_map_with_thread *self; //指向原始的位置

  };

  void sort(struct sorted_order_str_map_with_thread smwt[], const int size,

  int (*cmp)(void *, void *),

  void (*swap)(void *q1, void *q2));

  int cmp_node(void *, void *);

  //比较函数,如果相同则将其tag位设置为0,标示要删除

  int cmp_node(void *q1, void *q2)

  {

  int res;

  struct sorted_order_str_map_with_thread *cmp1, *cmp2;

  cmp1 = (struct sorted_order_str_map_with_thread*)q1;

  cmp2 = (struct sorted_order_str_map_with_thread*)q2;

  res = strcmp(cmp1->sorted_order_str, cmp2->sorted_order_str);

  if (res == 0) {

  struct sorted_order_str_map_with_thread *p = cmp2->self;

  p->tag  = 0;

  }

  return res;

  }

  //交换函数,不光要交换元素,还要交换其self指针

  void swap_node(void *q1, void *q2)

  {

  struct sorted_order_str_map_with_thread *swp1, *swp2,*temp;

  char *strTemp;

  swp1 = (struct sorted_order_str_map_with_thread*)q1;

  swp2 = (struct sorted_order_str_map_with_thread*)q2;

  strTemp = swp1->sorted_order_str;

  temp = (swp1->self);

  swp1->sorted_order_str = swp2->sorted_order_str;

  swp1->self = swp2->self;

  swp2->sorted_order_str = strTemp;

  swp2->self = temp;

  }

  //标准冒泡排序

  void sort(struct sorted_order_str_map_with_thread smwt[], const int size,

  int (*cmp)(void *q1, void *q2),

  void (*swap)(void *q1, void *q2))

  {

  int flag = 1;

  for (int i = 0; i < size - 1; i ++) {

  flag = 1;

  for (int j = 0; j < size - i - 1; j ++) {

  int res = 0;

  if ((res = cmp(&smwt[j], &smwt[j+1])) > 0) {

  swap(&smwt[j], &smwt[j+1]);

  flag = 0;

  }

  }

  if (flag == 1)

  break;

  }

  }

     

首页 上一页 1 2 3 4 5 6 7 下一页 尾页 1/18/18
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇在字符串中删除特定的字符 下一篇在数组中编辑定长字符串

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: