64,637
社区成员
发帖
与我相关
我的任务
分享
//文件1中的内容排序并去重,结果保存到文件2中
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXCHARS 128 //能处理的最大行宽,包括行尾的\n和字符串尾的\0
int MAXLINES=10000,MAXLINES2;
char *buf,*buf2;
int c,n,hh,i,L;
FILE *f;
char ln[MAXCHARS];
int ignore_case=0;
int icompare(const void *arg1,const void *arg2) {
return stricmp((char *)arg1,(char *)arg2);
}
int compare(const void *arg1,const void *arg2) {
return strcmp((char *)arg1,(char *)arg2);
}
int main(int argc,char **argv) {
if (argc<3) {
printf("Unique line. Designed by zhao4zhong1@163.com. 2012-08-20\n");
printf("Usage: %s src.txt uniqued.txt [-i]\n",argv[0]);
return 1;
}
if (argc>3) ignore_case=1;//若存在命令行参数3,忽略大小写
f=fopen(argv[1],"r");
if (NULL==f) {
printf("Can not find file %s!\n",argv[1]);
return 1;
}
buf=(char *)malloc(MAXLINES*MAXCHARS);
if (NULL==buf) {
fclose(f);
printf("Can not malloc(%d LINES*%d CHARS)!\n",MAXLINES,MAXCHARS);
return 2;
}
n=0;
hh=0;
i=0;
while (1) {
if (NULL==fgets(ln,MAXCHARS,f)) break;//
hh++;
L=strlen(ln)-1;
if ('\n'!=ln[L]) {//超长行忽略后面内容
printf("%s Line %d too long(>%d),spilth ignored.\n",argv[1],hh,MAXCHARS);
while (1) {
c=fgetc(f);
if ('\n'==c || EOF==c) break;//
}
}
while (1) {//去掉行尾的'\n'和空格
if ('\n'==ln[L] || ' '==ln[L]) {
ln[L]=0;
L--;
if (L<0) break;//
} else break;//
}
if (L>=0) {
strcpy(buf+i,ln);i+=MAXCHARS;
n++;
if (n>=MAXLINES) {
MAXLINES2=MAXLINES*2;
if (MAXLINES2==1280000) MAXLINES2=2500000;
buf2=(char *)realloc(buf,MAXLINES2*MAXCHARS);
if (NULL==buf2) {
printf("Can not malloc(%d LINES*%d CHARS)!\n",MAXLINES2,MAXCHARS);
printf("WARNING: Lines >%d ignored.\n",MAXLINES);
break;//
}
buf=buf2;
MAXLINES=MAXLINES2;
}
}
}
fclose(f);
if (n>1) {
if (ignore_case) qsort(buf,n,MAXCHARS,icompare);
else qsort(buf,n,MAXCHARS,compare);
}
f=fopen(argv[2],"w");
if (NULL==f) {
free(buf);
printf("Can not create file %s!\n",argv[2]);
return 2;
}
fprintf(f,"%s\n",buf);
if (n>1) {
if (ignore_case) {
hh=0;
L=MAXCHARS;
for (i=1;i<n;i++) {
if (stricmp((const char *)buf+hh,(const char *)buf+L)) {
fprintf(f,"%s\n",buf+L);
}
hh=L;
L+=MAXCHARS;
}
} else {
hh=0;
L=MAXCHARS;
for (i=1;i<n;i++) {
if ( strcmp((const char *)buf+hh,(const char *)buf+L)) {
fprintf(f,"%s\n",buf+L);
}
hh=L;
L+=MAXCHARS;
}
}
}
fclose(f);
free(buf);
return 0;
}
法一
#include "map"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int A[] = {1,2,3,4,3,2,1,6};
int item = sizeof(A)/sizeof(int);
map<int,int> mp;
for (int i=0;i<item;i++)
{
mp[A[i]]=A[i];
}
map<int,int>::iterator itor;
for (itor=mp.begin();itor!=mp.end();itor++)
{
printf("%d,",itor->first);
}
system("pause");
}
//法二
void printarr(int *a,int n)
{
for(int i=0;i<n;i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
void bubble(int *a,int n)
{
int i,j,temp;
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(a[i]>a[j])
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
printarr(a,n);
}
int _tmain_f1(int argc, _TCHAR* argv[])
{
int A[] = {1,2,3,4,3,2,1,6};
int item = sizeof(A)/sizeof(int);
bubble(A,item);
int* p = new int[item];
int ic = 0;
for (int i=0;i<item;i++)
{
if (i==0)
{
*p = A[0];
ic++;
}
else
{
if (p[ic-1]!=A[i])
{
p[ic]=A[i];
ic++;
}
}
}
printarr(p,ic);
system("pause");
return 0;
}
//查找p1,p2共同祖先
//parent为pNode,的父结点pNode为当前要处理的结点。若pNde为根时,parent 为NULL
//FindNodeByValue为根据元素来查找结点的位置,这个很简单,自己写。
PtrTreeNode FindAncestor( PtrTreeNode parent, PtrTreeNode pNode, Element p1, Element p2 )
{
PtrTreeNode pTemp = NULL;
PtrTreeNode pTempP1 = NULL, pTempP2 = NULL;
if ( pNode == NULL ) return false;
pTempP1 = FindNodeByValue( pNode, p1 );
pTempP2 = FindNodeByValue( pNode, p2 );
if ( (pTempP1==pNode) || (pNode ==pTempP2) ) return parent; //如果当前结点与p1,或者p2一样那就返回父结点
if ( pTempP1 && pTempP2 )
{
if (pNode->pLeftChild != NULL ) pTemp = FindAncestor( pNode, pNode->pLeftChild, p1, p2 );
if ( pTemp != NULL ) return pTemp;
return FindAncestor( pNode, pNode->pRightChild, p1, p2 );
}
else
{
return parent;
}
}
2 目前能想到的就是用散列来做。