C语言二维数组中 删除数组中的重复元素

tyyhong 2009-09-09 06:40:56
定义数组:

char arr[10][20];


这代表有10个字符串类型的数组,如果数组的内容如下:

arr[0]="abcd";
arr[1]="bbbbbbbbb";
arr[2]="ccccccc";
arr[3]="aaaaa";
arr[4]="aaaaa";
arr[5]="abcd";
arr[6]="11111";

请问怎么删除这里面的重复项:
变成:
arr[0]="abcd";
arr[1]="bbbbbbbbb";
arr[2]="ccccccc";
arr[3]="aaaaa";
arr[4]="";
arr[5]="";
arr[6]="11111";





...全文
1137 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
samsinx 2009-09-16
  • 打赏
  • 举报
回复
void strdeldup()
{
char arr[10][20] = {
{"abcd"},
{"bbbbbbbbb"},
{"ccccccc"},
{"aaaaa"},
{"aaaaa"},
{"abcd"},
{"11111"}
};

int i, j;
for ( i = 1; i < 7; i++){
for ( j = 0; j < i; j++){
if ( strcmp(arr[i], arr[j]) == 0){
strcpy(arr[i], "\"\"") ;
break ;
}
}
}

for ( i = 0 ;i < 10; i++ ) {
printf("%s\n", arr[i]);
}

}
liate1 2009-09-16
  • 打赏
  • 举报
回复
都是遍历求解啊?
pydle 2009-09-14
  • 打赏
  • 举报
回复
28 #include <stdio.h>
29 #include <stdlib.h>
30 int main()
31 {
32 char *arr[7] = { "abcd",
33 "bbbbbbbbb",
34 "ccccccccc",
35 "aaaaa",
36 "aaaaa",
37 "abcd",
38 "11111"};
39 int i;
40 int j;
41 for(j = 0;j<7;j++)
42 {
43 for( i = j+1;i<7;i++)
44 {
45
46 if( arr[j] == arr[i])
47 arr[j] = "";
48 }
49 }
50 for( i = 0; i<7;i++)
51 printf("%s\n",arr[i]);
52
53
58 return 0;
59 }
emailtome 2009-09-14
  • 打赏
  • 举报
回复
做个简单的 结构体数组
struct xxxx
{
id --->唯一 ID 通过 函数算 比如 你把每个字符相加
data
}
下面就不说了呵呵 !

wenhuahetao 2009-09-14
  • 打赏
  • 举报
回复
你需要用到数据结构
也就是把不是重复的字符串放入那个数据结构中,最好用链表,很方便的,然后打印链表即可
我给个java程序你
import java.util.ArrayList;

public class A {

static ArrayList al = new ArrayList ();
public static void main(String[] args) {
String[] res = {"abc","abcd","abc","abc","abcd",
"abcde","abcde"};
int len = res.length;
for (int i =0 ;i<len;++i){
if (isValid (res[i])){
System.out.println(res[i]);
}
}
}

public static boolean isValid (String str){
boolean res = false;
if (al.size() == 0){
al.add(str);
return true;
}
for (int i = 0;i<al.size();++i){
if (al.get(i).equals(str)){
return false;
}
}
al.add(str);
return true;
}
}
稍微改一下成为C语言就可以
但要用到链表,我懒得写链表,所以用java
有问题callme
810097972
wenhuahetao 2009-09-14
  • 打赏
  • 举报
回复
你需要用到数据结构
也就是把不是重复的字符串放入那个数据结构中,最好用链表,很方便的,然后打印链表即可
我给个java程序你
import java.util.ArrayList;

public class A {

static ArrayList al = new ArrayList ();
public static void main(String[] args) {
String[] res = {"abc","abcd","abc","abc","abcd",
"abcde","abcde"};
int len = res.length;
for (int i =0 ;i<len;++i){
if (isValid (res[i])){
System.out.println(res[i]);
}
}
}

public static boolean isValid (String str){
boolean res = false;
if (al.size() == 0){
al.add(str);
return true;
}
for (int i = 0;i<al.size();++i){
if (al.get(i).equals(str)){
return false;
}
}
al.add(str);
return true;
}
}
稍微改一下成为C语言就可以
但要用到链表,我懒得写链表,所以用java
有问题callme
810097972
whg01 2009-09-09
  • 打赏
  • 举报
回复
变成你要的样子,只能用冒泡排序的模式,逐个比较。
arr[10][20];
for (i=0;i<10-1;i++)
{
for (j=i+1;j<10;j++)
{
if (!strcmp(arr[i],arr[j]))
arr[j][0] = 0x00; //设置为空字符串。
}
}
如果要把空的放最后,直接用快速排序qsort。
rilon1988 2009-09-09
  • 打赏
  • 举报
回复
首先用一个*str[20]指向这二位数组,
用一个双重循环逐渐比较*str[]所指向的数组,如果符合条件就把改一维数组的值变为""
如果条件不成立,就使*str[]指向arr[10][20]的第二个字符数组。一次循环。
fjx1982441 2009-09-09
  • 打赏
  • 举报
回复
同意楼上。
不过,楼主是不是想要更快速的算法?
mstlq 2009-09-09
  • 打赏
  • 举报
回复
两重循环
strcmp

69,371

社区成员

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

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