C语言过滤相同行算法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言过滤相同行算法相关的知识,希望对你有一定的参考价值。

研究了半个小时了,这个算法怎么写都有问题,不好储存,求高手来段有效的C算法

文本

123123
asdfasdf
vbbbb
vbbbb
vbbbb
asdfasdf
123123

过滤为

123123
asdfasdf
vbbbb
三位说的好象都词不达意,给个具体代码可以吗,感觉各位说的都有些注重理论,我用两个数组已经标识符都测试过,但是算法始终有问题,能写出个具体的吗,分数不是问题

感觉你们都说删除但是没说如何删除

一定要初始化, 初始化为0即可, 数组使用初始化为全零即可, 这样会去掉尾部的"烫"之类的乱码
////还有就是, 你的每次输入操作前, 都应该使用fflush(stdin);操作, 把输入缓冲的东西消掉, 省的影响后面的输入, 比如scanf, gets等函数前都应该加上这个.
////看来你是想写个什么系统, 但是我不知道你的系统命令格式, 瞎调试了一下, 没看出什么异常, 主要是对用户输入非法命令的过滤还不太够, 注意加强一点.即可.
////最后, 注意代码编写习惯, 越清晰流程越好, 呵呵, 就说这么多了.
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXLEN 100
#define MAXSIZE 50
typedef int Status;
//*公用文件头

typedef struct ResultType

int CmdNo; //命令号或命令符
int s[3]; //命令的串参数的内部名(最多3)
int num[2]; //命令的数值参数(最多2个)
ResultType,*Result ;
typedef struct
char * ch; //若为非空串,则按串长分配存储区,否则ch为NULL
int length; //串长度
int state; //状态量
HString,*String;

typedef struct
HString StrHead[100]; //串头数组
int CurNum; StrHeadList,*StrHead;

typedef int mark;
mark m;
StrHeadList *H;
HString *K;
Status get(int s,char d[100]);
Status sys(Result p);
Status show();
Status compare(char s1[100]);
void StrCompare(HString S,HString T);
Status get(int n);

int main()
char c;int i;
ResultType *p;
if(!(K=(String)malloc(sizeof(HString)))) printf("Overfolw2!\n");
if(!(H=(StrHead )malloc(sizeof(StrHeadList)))) printf("Overfolw4!\n"); //申请H的空间
for(i=0;i<=99;i++)
H->StrHead[i].ch=NULL;
H->StrHead[i].length=0;
H->StrHead[i].state=0;
//初始化H的数值
H->CurNum=0;
p=(Result )malloc(sizeof(ResultType));
do
printf(" 请选择你要进行的操作: \n");
printf("==== ======A.进入系统====== =====\n");
printf("==== ======B.输入格式====== =====\n");
printf("==== ======C.退出系统====== =====\n");
printf("================================================\n");
scanf("%c",&c);
getchar();
switch(c)
case'A':sys(p);break;
case'C': break;
default: printf("指令不在范围内,请重新输入!\n"); break;
//switch
while(c!='C');//while
free(K);free(H);free(p);
return OK;
//main
Status sys(Result p)
char s1[100]=,s2[50]=;
int i,j,n; //定义局部变量
while(s1[0]!='Q')
printf("请进行操作:\n");
m=0;
gets(s1);
switch(s1[m]) //判断指令类型
case'A':get(p->s[0],s1);
break;
//case A
default: printf("输入错误!\n");
//switch
;//while
return 1;
//sys
Status get(int n,char s1[100])//将串值赋入串头表中
char s[50]=;
H->CurNum=0;
int o;o=n;
while(H->StrHead[H->CurNum].state==1) H->CurNum++;
n=H->CurNum++;printf("N:%d\n",n);
int i=0,j=0;
m++;
while(s1[m]==' ') m++; //s1为从键盘接收到的字符串
if(s1[m]=='\'')
i=0;
m++;printf("here");
while(s1[m]!='\'')
//if
if(!(H->StrHead[n].ch=(char *)malloc(i*sizeof (char)))) exit(OVERFLOW);
H->StrHead[n].length=i;
printf("hold!in get 1\n");getchar();
H->StrHead[n].state=1; //标记已存
printf("hold!in get 1.5\n");getchar();
for(j=0;j<i;j++)
H->StrHead[n].ch[j]=s[j];//值存入相应的串头表

printf("hold!in get 2\n");getchar();
printf("新串的内部名和串值为:\n");
printf("%5d ",n);
printf("%s\n",H->StrHead[n]); printf("%s\n",s); //回显新串
return OK;
//get
另外,虚机团上产品团购,超级便宜
参考技术A 一定要初始化, 初始化为0即可, 数组使用初始化为全零即可, 这样会去掉尾部的"烫"之类的乱码
////还有就是, 你的每次输入操作前, 都应该使用fflush(stdin);操作, 把输入缓冲的东西消掉, 省的影响后面的输入, 比如scanf, gets等函数前都应该加上这个.
////看来你是想写个什么系统, 但是我不知道你的系统命令格式, 瞎调试了一下, 没看出什么异常, 主要是对用户输入非法命令的过滤还不太够, 注意加强一点.即可.
////最后, 注意代码编写习惯, 越清晰流程越好, 呵呵, 就说这么多了.
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXLEN 100
#define MAXSIZE 50
typedef int Status;
//*公用文件头

typedef struct ResultType

int CmdNo; //命令号或命令符
int s[3]; //命令的串参数的内部名(最多3)
int num[2]; //命令的数值参数(最多2个)
ResultType,*Result ;
typedef struct
char * ch; //若为非空串,则按串长分配存储区,否则ch为NULL
int length; //串长度
int state; //状态量
HString,*String;

typedef struct
HString StrHead[100]; //串头数组
int CurNum; StrHeadList,*StrHead;

typedef int mark;
mark m;
StrHeadList *H;
HString *K;
Status get(int s,char d[100]);
Status sys(Result p);
Status show();
Status compare(char s1[100]);
void StrCompare(HString S,HString T);
Status get(int n);

int main()
char c;int i;
ResultType *p;
if(!(K=(String)malloc(sizeof(HString)))) printf("Overfolw2!\n");
if(!(H=(StrHead )malloc(sizeof(StrHeadList)))) printf("Overfolw4!\n"); //申请H的空间
for(i=0;i<=99;i++)
H->StrHead[i].ch=NULL;
H->StrHead[i].length=0;
H->StrHead[i].state=0;
//初始化H的数值
H->CurNum=0;
p=(Result )malloc(sizeof(ResultType));
do
printf(" 请选择你要进行的操作: \n");
printf("==== ======A.进入系统====== =====\n");
printf("==== ======B.输入格式====== =====\n");
printf("==== ======C.退出系统====== =====\n");
printf("================================================\n");
scanf("%c",&c);
getchar();
switch(c)
case'A':sys(p);break;
case'C': break;
default: printf("指令不在范围内,请重新输入!\n"); break;
//switch
while(c!='C');//while
free(K);free(H);free(p);
return OK;
//main
Status sys(Result p)
char s1[100]=,s2[50]=;
int i,j,n; //定义局部变量
while(s1[0]!='Q')
printf("请进行操作:\n");
m=0;
gets(s1);
switch(s1[m]) //判断指令类型
case'A':get(p->s[0],s1);
break;
//case A
default: printf("输入错误!\n");
//switch
;//while
return 1;
//sys
Status get(int n,char s1[100])//将串值赋入串头表中
char s[50]=;
H->CurNum=0;
int o;o=n;
while(H->StrHead[H->CurNum].state==1) H->CurNum++;
n=H->CurNum++;printf("N:%d\n",n);
int i=0,j=0;
m++;
while(s1[m]==' ') m++; //s1为从键盘接收到的字符串
if(s1[m]=='\'')
i=0;
m++;printf("here");
while(s1[m]!='\'')
//if
if(!(H->StrHead[n].ch=(char *)malloc(i*sizeof (char)))) exit(OVERFLOW);
H->StrHead[n].length=i;
printf("hold!in get 1\n");getchar();
H->StrHead[n].state=1; //标记已存
printf("hold!in get 1.5\n");getchar();
for(j=0;j<i;j++)
H->StrHead[n].ch[j]=s[j];//值存入相应的串头表

printf("hold!in get 2\n");getchar();
printf("新串的内部名和串值为:\n");
printf("%5d ",n);
printf("%s\n",H->StrHead[n]); printf("%s\n",s); //回显新串
return OK;
//get
参考技术B 简而言之:
每检查一行,都查看该行之后是否有与之相同的行,有则删除。
最后得到的就是过滤好的文本。

你可以这样做:
char * line; //记录 每一行的信息;
int lineTotal; // 总行数
for( i=0; i<lineTotal; i++ )

该行读入line。
检查 i行之后是否有某行与line 内容相同。有则删除。

参考技术C 这个是用的字符串数组,建议修改成链表,因为C里不能用STL库,如果是C++的话,可以用动态数组vector
#include <stdio.h>
#include <string.h>
void main()

char *p[7] = "123123", "asdfasdf", "vbbbb", "vbbbb", "vbbbb", "asdfasdf", "123123";
char *r[7] = "", "", "", "", "", "", "";

for (int i = 0; i < 7; i++)

int bIs = 1;
for (int j = 0; j < 7; j++)

if (strcmp(r[j], "") == 0)

break;

else if (strcmp(p[i], r[j]) == 0)

bIs = 0;
break;



if (bIs == 1)

r[j] = p[i];



for (i = 0; i < 7; i++)

if (strcmp(r[i], "") == 0)

break;

else

printf("%s\n", r[i]);


参考技术D 自己写一个Set这样的数据结构,
从文本里面读取一个字符串,插入到Set里面,指导文本读取完毕,
然后把set里面的String都保存在新的文本里面就行了。

set就是一个集合。里面不会保存相同的关键字。
具体怎么写,可查阅相关的资料,不会可以问我,就是一个红黑树。

以上是关于C语言过滤相同行算法的主要内容,如果未能解决你的问题,请参考以下文章

C语言实现八大排序算法

(C语言中)逆波兰算法(及计算器)

c语言查找二维数组的鞍点 新生求助大佬

C语言怎么编写:请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。

C语言课程设计

C语言如何实现满足多条件匹配简单过滤问题