删除一组行中的任何重复值

时间:2017-05-12 16:33:20

标签: c arrays sorting

我有一个由许多行组成的文件,其中每行包含两个值,如:

    53539 14390
    14390 49489
    52882 49489
    23623 14390
    23623 7554
    23678 14390
        .
        .
        .

我写了一个c代码来读取这些行并将它们存储在两个表T1和amp; T2其中:

T1[0][1]= 53539 & T2[0][1]= 14390
T1[1][1]= 14390 & T2[1][1]= 49489
T1[2][1]= 52882 & T2[2][1]= 49489
   .
   .
   .

一切都很好......我知道我可以将两个值存储在一个表中,但我认为我的程序最好定义两个不同的表,尤其是出于以下目的

我尝试做的第二件事是搜索所有值,并指定和统计两个表中的未重复值的数量(我的意思是两列中的唯一值,这两个表中的值只出现一次),如我的例子:未重复的值是:53539,52882,7554& 23678所以这个数字是4

问题我的代码的第二部分没有以良好的方式工作,它给了我错误的值,我试图解决它,但它仍然没有工作!!

我知道我的问题对所有程序员来说都很容易,但实际上我是c和编码的初学者。

您可以在我的代码尝试下方看到:

#include <stdio.h>
#include <stdlib.h>


#define nOfLines 6


int main()
    {


FILE *file;
int i, j, ii, jj;
int T1[nOfLines][1], T2[nOfLines][1];
file=fopen("ngc.txt","r");



for(i=0; i < nOfLines ; i++) {
    fscanf(file,"%d %d", &T1[i][1], &T2[i][1]);
    printf("%d %d\n ",  T1[i][1], T2[i][1]);
   }



  int z=0;
  for(i=0; i < nOfLines ; i++) {
  for(j=0; j < nOfLines ; j++) {

  if ((T1[i][1] == T1[j][1]) || (T1[i][1] == T2[i][1]) || (T2[i][1] == T2[j][1]))
   {
  break;
  }

  printf("%d %d\n", T1[i][0], z);
  z++;
  printf("%d %d\n", T2[i][1], z);
  z++;
  }
  }
  fclose(file);
  return 0;
  }

P.S:我写了一个循环,因为我有大量的行,因此无法在此代码中输入插入每个值 ALSO 我尝试做类似的事情:

 if (!found(T1[i][1])) {printf("%d %d\n", T1[i][1], z);z++;}
 if (!found(T2[i][1])) {printf("%d %d\n", T2[i][1], z);z++;}

但它不起作用!!

提前感谢任何形式的帮助......

1 个答案:

答案 0 :(得分:1)

将所有值存储在选项卡中,就像您一样。然后,您可以遍历该选项卡并将每个值与其他值进行比较。让我们说你的标签设置了值,这是你可能做的一个例子:

void deleteRepeatedValues(int* tab)
{
    int size = strlen(tab);
    for (int i = 0; i != size; i++) // For each value of the tab
    {
        if (tab[i] != 0) // If the value hasn't already be set to 0
        {
           for (int j = i; j != size; j++)
           {
                if (tab[i] == tab[j]) // We verify that the value after aren't the same
                    tab[j] = 0; // If they are, we set them to 0
           }
        }
    }
}

然后你可以编写一个函数来创建一个没有数组零值部分的新数组。这样的事情:

deleteRepeatedValues(tab);
int size = sizeof(tab);
int correctedTab[size];
int i = 0;
int y = 0;
while(i != size)
{
    if (tab[i] != 0) // If the value is not repeated
    {
        correctedTab[y] = tab[i]; // We copy it
        y++; // And advance in the corrected tab
    } // Otherwise we don't
    i++; // And only go further in `tab`
}

到目前为止,我无法测试此代码,并且我还没有尝试将其调整为您已经完成的操作。这是一种做你想做的事情的暗示。

另外,我建议你测试打开和关闭文件是否成功。它可以避免很多问题。