C语言文件读取和单链表的添加、删除和排序等操作实例
C语言文件读取和单链表的添加、删除和排序等操作实例
/*
1、从文本文件中导入班级学生信息:学号、姓名、性别、籍贯
2、将学号重复的删除
3、显示导入的学生信息
4、按学号、姓名、性别、籍贯相等和不相等查找
5、多次查找
6、查找结果写入文件
7、VC++6.0编译通过
//以下代码存为main.cpp
*/
#include
#include
#include
#include
#include
#include
#define CLRSCRsystem("cls")
#define PRINT_TITLE "\n序号\t学号\t\t姓名\t性别 \t籍贯\n"
#define PRINT_FORMAT "%d\t%s\t%s\t%s\t%s\n",i,p->stu.num,p->stu.name,p->stu.sex,p->stu.hometown
#define WRITE_FORMAT "%s\t%s\t%s\t%s\n",p->stu.num,p->stu.name,p->stu.sex,p->stu.hometown
#define READ_FORMAT "%s %s %s %s",&p->stu.num,&p->stu.name,&p->stu.sex,&p->stu.hometown
//定义学生结构体
struct student
{
charnum[9];
char name[7];//三个汉字长度为6个字节,如果不多定义一个字节来存放字符串结束符'\0',当输出name时会把sex和hometown也输出
charsex[3];
charhometown[7];
};
//定义单链表结点
typedef struct listnode
{
struct student stu;
struct listnode *next;
}node;
int MySelect(node * head,node *temp) //返回查找到符合条件的项目数
{
int equal,N;
char CHAR[10];
printf("----------------------------------------------\n\n");
printf("查找模式:1是相等查找,0是不相等查找\n");
printf("列名编号:1是学号,2是姓名,3是性别,4是籍贯\n");
printf("\n--------------------------------------------\n");
do
{
printf("\n选择查找模式:");//用scanf时输入字母会错误 改用getche,不用scanf
equal=getche();
if((equal!='1')&&(equal!='0'))
printf("\n\t输入错误\n");
}
while((equal!='1')&&(equal!='0'));
equal=equal-48;
do
{
printf("\n输入列名编号:");
N=getche();
if(N!='1'&&N!='2'&&N!='3'&&N!='4')
printf("\n\t输入错误\n");
}
while(N!='1'&&N!='2'&&N!='3'&&N!='4');
switch(N)
{
case '1':N=0;break;
case '2':N=9;break;
case '3':N=16;break;
case '4':N=19;break;
}
printf("\n输入关键字:");
scanf("%s",CHAR);
int i=0,flag;
node *p,*tp=temp;
p=head->next;
while (NULL!=p)
{
flag=strcmp((char *)p+N,CHAR);
if((abs(flag)+equal)==1)//当equal为1时是相等查找,为0时是不相等查找
{
node *end;
end = (node *)malloc(sizeof(node));
tp->next=end;
tp=end;
tp->next=NULL;
tp->stu=p->stu;
if(i==0)
printf (PRINT_TITLE);
i++;
printf(PRINT_FOR