Code/Resource
Windows Develop
Linux-Unix program
Internet-Socket-Network
Web Server
Browser Client
Ftp Server
Ftp Client
Browser Plugins
Proxy Server
Email Server
Email Client
WEB Mail
Firewall-Security
Telnet Server
Telnet Client
ICQ-IM-Chat
Search Engine
Sniffer Package capture
Remote Control
xml-soap-webservice
P2P
WEB(ASP,PHP,...)
TCP/IP Stack
SNMP
Grid Computing
SilverLight
DNS
Cluster Service
Network Security
Communication-Mobile
Game Program
Editor
Multimedia program
Graph program
Compiler program
Compress-Decompress algrithms
Crypt_Decrypt algrithms
Mathimatics-Numerical algorithms
MultiLanguage
Disk/Storage
Java Develop
assembly language
Applications
Other systems
Database system
Embeded-SCM Develop
FlashMX/Flex
source in ebook
Delphi VCL
OS Develop
MiddleWare
MPI
MacOS develop
LabView
ELanguage
Software/Tools
E-Books
Artical/Document
com.c
Package: work.rar [view]
Upload User: bafish
Upload Date: 2021-11-22
Package Size: 158k
Code Size: 12k
Category:
Compress-Decompress algrithms
Development Platform:
Visual C++
- #include "com.h"
- /*********************************************************
- *函数名:loadFromFile
- *形参:style,生成有序链表的排序方式,
- * style=1,按姓名升序排序
- * style=2,按姓名降序排序
- * style=3,按薪水升序排序
- * style=4,按薪水升序排序
- * style=其他,按编号升序排序
- *返回值:生成链表的头指针
- *函数功能:从文件中把数据全部读出,用插入法生成链表并返回头指针head
- *作者:qjh
- *编写日期:2008-9-18
- **********************************************************/
- MEMBER * loadFromFile( int style )
- {
- MEMBER *head; //链表的头指针
- MEMBER *node; //申请新结点的指针
- FILE *fp; //文件指针
- char ch; //保存用户是否要创建文件的变量
- fp = fopen( FILENAME , "rb" );
- if ( NULL == fp ) //文件打开不成功
- {
- printf("数据文件不存在.n");
- printf("是否需要重新创建新文件(y/n):");
- ch = getche( );//接收用户的选择输入//getch(), getchar()
- if ( 'y' == ch || 'Y' == ch )
- {
- fp = fopen( FILENAME , "wb" );
- fclose(fp);
- fp = fopen( FILENAME , "rb" );
- }
- else //用户选择的是不创建文件,退出系统
- {
- exit(0);
- }
- }
- //申请头结点
- head = ( MEMBER * )malloc(sizeof(MEMBER));
- head->next = NULL;
- node = ( MEMBER *)malloc(sizeof(MEMBER));
- node->next = NULL;
- if ( fread(node, sizeof(MEMBER), 1, fp ) == 1 )//如果读取成功
- {
- //将结点插入到链表中
- //MEMBER * insert(MEMBER *head,MEMBER *newNode,int style)
- head = insert( head, node, style);
- while ( !feof( fp ) )//没有到文件尾
- {
- node = ( MEMBER *)malloc(sizeof(MEMBER));
- node->next = NULL;
- if ( fread(node, sizeof(MEMBER), 1, fp ) == 1 )
- {
- head = insert( head, node, style);
- }
- else
- {
- free(node);
- }
- }
- }
- //关闭文件
- fclose(fp);
- return head;
- }
- /*********************************************************
- *函数名:insert
- *形参:head,要被插入的链表的头指针;
- * newNode,要插入的结点的指针;
- * style,排序方式
- *返回值:更新后链表的头指针
- *函数功能:将新结点newNode插入到链表head中,按指定的排序方式style插入,
- * 默认按编号升序插入
- * style=1,按姓名升序排序
- * style=2,按姓名降序排序
- * style=3,按薪水升序排序
- * style=4,按薪水升序排序
- * style=其他,按编号升序排序
- *作者:qjh
- *编写日期:2008-9-18
- **********************************************************/
- MEMBER * insert(MEMBER *head,MEMBER *newNode,int style)
- {
- MEMBER *p1, *p2;
- p1 = head;
- p2 = head->next;
- switch( style )
- {
- case 1: //按姓名升序插入
- while ( p2 != NULL )
- {
- if ( strcmp (p2->name , newNode->name ) < 0 )
- {
- p1 = p1->next;
- p2 = p2->next;
- }
- else
- break;
- }
- break;
- case 2: //按姓名降序插入
- while ( p2 != NULL )
- {
- if ( strcmp (p2->name , newNode->name ) > 0 )
- {
- p1 = p1->next;
- p2 = p2->next;
- }
- else
- break;
- }
- break;
- case 3: //按薪水升序插入
- while ( p2 != NULL )
- {
- if ( p2->salary < newNode->salary )
- {
- p1 = p1->next;
- p2 = p2->next;
- }
- else
- break;
- }
- break;
- case 4: //按薪水降序插入
- while ( p2 != NULL )
- {
- if ( p2->salary > newNode->salary )
- {
- p1 = p1->next;
- p2 = p2->next;
- }
- else
- break;
- }
- break;
- default: //按编号升序插入
- while ( p2 != NULL )
- {
- if ( strcmp (p2->number , newNode->number ) < 0 )
- {
- p1 = p1->next;
- p2 = p2->next;
- }
- else
- break;
- }
- break;
- }
- newNode->next = p2;
- p1->next = newNode;
- return head;
- }
- /*********************************************************
- *函数名:writeToFile
- *形参:要写入的链表的头指针
- *返回值:无
- *函数功能:将头指针为head的链表全部写入到文件中
- *作者:qjh
- *编写日期:2008-9-18
- **********************************************************/
- void writeToFile(MEMBER *head)
- {
- MEMBER *p;
- FILE *fp;
- if ( NULL == head )
- {
- printf("链表头指针为空,无法继续操作n");
- return; //退出函数,并非退出整个程序
- }
- fp = fopen( FILENAME , "wb" );
- if ( NULL == fp )
- {
- printf("文件打开不成功,无法继续操作n");
- return ;
- }
- p = head->next;
- while ( p != NULL ) //链表未结束
- {
- fwrite( p , sizeof( MEMBER ), 1, fp );//将结点p写入到文件中
- p = p->next; //p后移一个结点
- }
- fclose( fp );
- }
- /*********************************************************
- *函数名:newNode
- *形参:head,链表的头指针
- *返回值:新建结点的指针
- *函数功能:新建一个结点,并从键盘为新结点赋值
- *作者:qjh
- *编写日期:2008-9-18
- **********************************************************/
- MEMBER * newNode(MEMBER *head)
- {
- //定义变量结点指针node,float tmp, char tmpDate[12];
- MEMBER *node; //
- float tmp; //用来临时存储浮点数,并最终赋值到结构体中
- char tmpDate[12];//用来输入一个日期字符串(yyyy-mm-dd)
- //申请结点空间 存储到 node
- node = ( MEMBER * )malloc( sizeof( MEMBER ) );
- if ( NULL == node ) //申请不成功
- {
- printf("结点申请不成功n");
- return NULL;
- }
- node->next = NULL;
- //输入编号,并验证
- do
- {
- printf("输入编号");
- gets( node->number );
- if ( strlen( node->number ) == 0 )//字符串为空
- {
- continue; //转去重新输入
- }
- //验证编号是否唯一
- //int unique(MEMBER* head,char * number);
- if ( unique( head, node->number ) == 0 ) //编号重复了
- {
- printf("编号有重复 ");
- continue;
- }
- break;//编号验证通过了,跳出循环
- }while(1);
- //输入姓名,并验证
- do
- {
- printf("输入姓名");
- gets( node->name );
- if ( strlen( node->name ) == 0 )//字符串为空
- {
- continue; //转去重新输入
- }
- break;//姓名验证通过了,跳出循环
- }while(1);
- //输入角色代号,并验证
- do
- {
- printf("输入角色代号(0-3)");
- if ( scanf( "%d", &node->role ) == 0)//输入的不是整型数据
- {
- while ( getchar() != 'n' ); //清除键盘缓冲区
- continue;
- }
- if ( node->role <0 || node->role > 3 )//不在0-3之间
- {
- while ( getchar() != 'n' ); //清除键盘缓冲区
- continue; //转去重新输入
- }
- break;//角色验证通过了,跳出循环
- }while(1);
- //输入年龄,并验证
- do
- {
- printf("输入年龄");
- if ( scanf( "%d", &node->age ) == 0)//输入的不是整型数据
- {
- while ( getchar() != 'n' ); //清除键盘缓冲区
- continue;
- }
- if ( node->role <0 )//
- {
- while ( getchar() != 'n' ); //清除键盘缓冲区
- continue; //转去重新输入
- }
- break;//年龄验证通过了,跳出循环
- }while(1);
- //输入身高,并验证
- do
- {
- printf("输入身高");
- if ( scanf( "%f", &tmp ) == 0)//输入的不是浮点型数据
- {
- while ( getchar() != 'n' ); //清除键盘缓冲区
- continue;
- }
- if ( tmp <0 )//不是正数
- {
- while ( getchar() != 'n' ); //清除键盘缓冲区
- continue; //转去重新输入
- }
- node->high = tmp;
- break;//身高验证通过了,跳出循环
- }while(1);
- //输入体重,并验证
- do
- {
- printf("输入体重");
- if ( scanf( "%f", &tmp ) == 0)//输入的不是浮点型数据
- {
- while ( getchar() != 'n' ); //清除键盘缓冲区
- continue;
- }
- if ( tmp <0 )//不是正数
- {
- while ( getchar() != 'n' ); //清除键盘缓冲区
- continue; //转去重新输入
- }
- node->weight = tmp;
- break;//体重验证通过了,跳出循环
- }while(1);
- //输入薪水,并验证
- do
- {
- printf("输入薪水");
- if ( scanf( "%f", &tmp ) == 0)//输入的不是浮点型数据
- {
- while ( getchar() != 'n' ); //清除键盘缓冲区
- continue;
- }
- if ( tmp <0 )//不是正数
- {
- while ( getchar() != 'n' ); //清除键盘缓冲区
- continue; //转去重新输入
- }
- node->salary = tmp;
- break;//薪水验证通过了,跳出循环
- }while(1);
- while (getchar( ) != 'n' ) ;//清除键盘缓冲区
- //输入加入日期,并验证
- do
- {
- printf("输入加入日期");
- gets( tmpDate );
- //验证加入时间是否有效
- //int checkDate(MEMBER *newNode, char *tmpDate);
- if ( checkDate( node, tmpDate ) == 0 ) //日期不合法
- {
- printf("日期格式有误 ");
- continue;
- }
- break;//日期验证通过了,跳出循环
- }while(1);
- //返回结点指针
- return node;
- }
- /*********************************************************
- *函数名:list
- *形参:无
- *返回值:无
- *函数功能:从文件读入数据,形成链表,并遍历链表输出所有数据
- *作者:qjh
- *编写日期:2008-9-18
- **********************************************************/
- void list(MEMBER *head)
- {
- MEMBER *p; //定义指针p
- p= head->next;
- printf("%6s", "编号");
- printf("%10s", "姓名");
- printf("%8s" , "角色");
- printf("%5s", "年龄");
- printf("%10s", "身高");
- printf("%10s", "体重");
- printf("%12s", "薪水");
- printf("%12sn", "加入日期");
- while ( p != NULL )
- {
- printf("%6s", p->number);//输出编号
- //输出姓名
- printf("%10s", p->name);
- //。。。
- printf("%8s" , roleSet[p->role]);
- printf("%5d", p->age);
- printf("%10.1f", p->high);
- printf("%10.1f", p->weight);
- printf("%12.2f", p->salary);
- printf("%6d-%2d-%2dn", p->joinDate.year,
- p->joinDate.month,
- p->joinDate.day);
- p = p->next;
- }
- }
- /*********************************************************
- *函数名:unique
- *形参:链表的头指针head,
- * 要判断的编号字符指针number
- *返回值:编号已经存在返回0,
- * 编号不存在返回1
- *函数功能:判断新输入的编号在链表中是否已经存在
- *作者:qjh
- *编写日期:2008-9-18
- **********************************************************/
- int unique(MEMBER* head,char * number)
- {
- MEMBER *p; //结点指针
- int flag; //标识是否唯一的变量(0表示不唯一,1表示唯一)
- flag = 1; //先假定本次编号验证会通过
- p = head->next;
- while ( p != NULL )
- {
- if ( strcmp( p->number , number ) == 0 ) //两 个字符串相同
- {
- flag = 0;
- return flag;
- }
- p = p->next; //p后移
- }
- return flag;
- }
- /*********************************************************
- *函数名:checkDate
- *形参:链表的头指针head,
- * 要判断的日期字符指针number
- *返回值:输入正确1,
- * 输入不正确返回0
- *函数功能:判断新输入的日期格式是否正确,正确则赋值给newNode返回1,
- * 否则返回0
- *作者:qjh
- *编写日期:2008-9-18
- **********************************************************/
- int checkDate(MEMBER *newNode, char *tmpDate)
- {
- unsigned int i, j;//数组的循环变量
- int d[8];//用来将输入的字符转换为年、月、日对应的数值
- int flag; //标识验证是否成功的变量(0不成功、1成功)
- flag = 1; //假定本次验证会成功
- if ( strlen( tmpDate ) != 10 ) //字符串长度不符
- {
- flag = 0;
- return flag;
- }
- if ( !(tmpDate[0] >= '0' && tmpDate[0] <= '9') )
- {
- flag = 0;
- return flag;
- }
- if ( !(tmpDate[1] >= '0' && tmpDate[1] <= '9') )
- {
- flag = 0;
- return flag;
- }
- if ( !(tmpDate[2] >= '0' && tmpDate[2] <= '9') )
- {
- flag = 0;
- return flag;
- }
- if ( !(tmpDate[3] >= '0' && tmpDate[3] <= '9') )
- {
- flag = 0;
- return flag;
- }
- if ( tmpDate[4] != '-' )
- {
- flag = 0;
- return flag;
- }
- if ( !(tmpDate[5] >= '0' && tmpDate[5] <= '9') )
- {
- flag = 0;
- return flag;
- }
- if ( !(tmpDate[6] >= '0' && tmpDate[6] <= '9') )
- {
- flag = 0;
- return flag;
- }
- if ( tmpDate[7] != '-' )
- {
- flag = 0;
- return flag;
- }
- if ( !(tmpDate[8] >= '0' && tmpDate[8] <= '9') )
- {
- flag = 0;
- return flag;
- }
- if ( !(tmpDate[9] >= '0' && tmpDate[9] <= '9') )
- {
- flag = 0;
- return flag;
- }
- //将每位数字字符转换成对应的数值,并且存储到数组d的各个元素中
- i = 0;
- for (j=0; j<strlen(tmpDate); j++)
- {
- if (tmpDate[j] != '-' )//不是‘-’,就是数字字符
- {
- d[i] = tmpDate[j] - '0';
- i++;
- }
- }
- //将年、月、日存储到结构体对应的成员中
- newNode->joinDate.year = d[0]*1000+d[1]*100+d[2]*10+d[3];
- newNode->joinDate.month = d[4]*10+d[5];
- newNode->joinDate.day = d[6]*10+d[7];
- if ( newNode->joinDate.year > 3000 ||
- newNode->joinDate.year < 0 )
- {
- flag = 0;
- return flag;
- }
- if ( newNode->joinDate.month <1 ||
- newNode->joinDate.month >12 )
- {
- flag = 0;
- return flag;
- }
- if ( newNode->joinDate.day < 1 ||
- newNode->joinDate.day > 31 )
- {
- flag = 0;
- return flag;
- }
- flag = 1;
- return flag;
- }
- /*********************************************************
- *函数名:freeList
- *形参:要释放的链表的头指针
- *返回值:无
- *函数功能:释放链表所有结点所占内存
- *作者:qjh
- *编写日期:2008-9-18
- **********************************************************/
- void freeList( MEMBER *head )
- {
- MEMBER *p , *q ;
- p = head;
- q = head->next;
- while ( q != NULL )
- {
- free( p );
- p = q;
- q = q->next;
- }
- free( p );
- head = NULL;
- }