文本文件单词的检索与计数

发布时间 : 星期五 文章文本文件单词的检索与计数更新完毕开始阅读

datatype data;

struct node *next ; }Listnode;

定义指向Listnode结构体的指针类型; Listnode *linklist,*A,*B;

A指向未处理的报警信息的链表头结点,B指向报警信息的链表头结点

(2)编写主函数,主函数中使用switch()语句,case1:中解决出警问题, 调用插入函数,记录下出警记录,并提示用户已经报警成功。但是由于题目要求报警信息储存过多时需要发出警告,首先对链表A进行遍历,若A的结点个数过多则输出警告信息,如下:

设置一个整型变量jj,遍历到链表A有一个结点jj则加1,以此来 记录结点的个数。

int jj=0; h=A->next;

while(h){ //通过链表遍历来确定有多少节点 jj++; h=h->next; }

if(jj>3){ //此时已有3次警务未处理

printf(\累计多次警务未处理,建议立即处理警务!\ break; }

插入函数void insertnode(linklist head,Listnode *x);

首先在case1中定义一个链表x,要求用户输入报警的信息,包括时间内容编号,将信息存储在x中,再将x插入到链表A中,插入的过程是:首先寻找合适的插入位置,再利用指针,进行插入。

void insertnode(linklist head,Listnode *x){ Listnode *p1,*p2; p1=head;

p2=p1->next ;

while(p2!=NULL&& ( p2->data.num < x->data.num )){ //寻找插入位置

p1=p2;

p2=p2->next ; }

p1->next =x; //按编号大小顺序插入 x->next =p2;}

这样不断地执行case1的操作,就会得到一个从头结点算起编号由小到大的链表,报警操作成功。

case2中调用删除函数,其中删除函数delnode()中调用了查找函数,所以先介绍查找函数

查找函数分按照编号查找和按时间查找,如果按编号查找,由于链表是从头结点开始编号由小到大的,所以比较需要查找的数字与链表中结点的编号的大小,若需要查找的数字大于链表中结点编号则指针p往后移,直至找到结点,返

回指针p。如果按照时间查找,则半段用户输入的时间这个字符串是否与链表结点中的时间字符串相等,若不等指针p还是往后移,直至查找到节点,返回p。

Listnode *listfind(linklist head){ //查找某节点 Listnode *p; int num;

char time[30]; int n;

printf(\按编号查询\\n\两种查找方式 printf(\按时间查询\\n\ printf(\请选择:\\n\ p=head->next ; scanf(\ if(n==1&&p!=NULL){

printf(\请输入要查找的编号:\ scanf(\

while(p->next!=NULL&& (p->data .num next ;

if(p==NULL||(p->data .num

if(n==2&&p!=NULL){

printf(\请输入要查找的时间:\ scanf(\

while(p&&strcmp(p->data .time,time)!=0) //比较字符串是否相同

p=p->next ; }

return p; }

而删除函数首先查找到需要出警的结点,从p指向的第一个结点开始,检查该结点中的num,或time值是否等于输入的要求删除的那个编号或时间。如果相等就将该结点删除,如不相等,就将p后移一个结点,再如此进行下去,直到遇到表尾为止。

int delnode(linklist head,Listnode *g){ Listnode *p,*q;

p=listfind(head); //执行查找函数 if(p==NULL){

printf(\没有查找到该事件\\n\ return 0; } else

{

q=head;//保存头结点

while(q!=NULL&&q->next==p) {q->next =p->next ; *g=*p; free(p); }return 1; }}

在case3中则调用输出函数,对储存出警情况的链表B进行输出。先将p结点的指针指向第一个结点,将p结点(即第一个结点)的数据输出。然后再将p结点的指针指向p指针的的指针(即下一结点),将p结点(即第一结点)的数据输出。重复执行此步聚直到p指针指向NULL为止。

void printlist(linklist head){ Listnode *p;

p=head->next ; //将第一个节点赋给p if(p==NULL){

printf(\没有信息!\\n\\n\ return; //返回空 }

printf(\编号 时间 内容 \\n\ while(p!=NULL) {

printf(\

p=p->next ; }

5.程序代码

#include

#include//字符串处理 #include typedef struct{

int num; //编号 ,这里用int 的型在后面比较大小时方便一点 char time[30]; //时间 char matter[50]; //内容 }datatype;

typedef struct node{ datatype data;

struct node *next ;

}Listnode,*linklist; //链表,定义了指向Listnode结构体的指针类型

Listnode *listfind(linklist head); //查找

void insertnode(linklist head,Listnode *x); //报警及出警保存记录(相当于链表的插入)

int delnode(linklist head,Listnode *x); //出警(相当于链表的删除,但该过程出警后,要在删除之前把节点插入到另一个链表中(保存记录的链表))

void printlist(linklist head); //输出所有未出警的和已出警的信息 /************主函数**********/ void main() {

int k;

int jj=0; //jj表示未处理的警务数量 Listnode *x; Listnode *h; Listnode *y;

Listnode *A,*B;//A是未处理的报警记录的链表头结点,B是已经出警的记录链表

A=(Listnode *)malloc(sizeof(Listnode)); B=(Listnode *)malloc(sizeof(Listnode));

A->next =NULL; //把指针域置空,这里A,B是头结点,没有信息的 B->next =NULL; while(12){

printf(\欢迎使用实时监控报警系统------\\n\ printf(\报警请按1---------------\\n\ printf(\出警请按2---------------\\n\

printf(\查询出警情况请按3---------------\\n\ printf(\退出请按0---------------\\n\ scanf(\ switch(k){ case 0:

printf(\感谢您的使用!\ exit(0);//正常结束程序运行 case 1:

h=A->next;

while(h){ //通过链表遍历来确定有多少节点 jj++; h=h->next; }

if(jj>2){ //此时已有10次警务未处理

printf(\累计多次警务未处理,建议立即处理警务!\\n\ break; } else {

printf(\请输入:\

printf(\编号\\t\\t时间\\t\\t内容:\

x=(Listnode *)malloc(sizeof(Listnode));

scanf(\

insertnode(A,x);

联系合同范文客服:xxxxx#qq.com(#替换为@)