应付老师部置的作业而写的,水平有限,写的不好。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<mysql.h>
typedef struct phonelist
{
char numbers[12];
char name[10];
struct phonelist *prev;
struct phonelist *next;
} PL, *PLP;
PLP create_list(PLP head)
{
PLP p,q;
p=head;
while(1)
{
q=(PLP)malloc(sizeof(PL));
if(q)
{
printf("请输入用户名(以-1作为结束标志):");
scanf("%s",q->name);
if(strcmp(q->name,"-1") == 0)
break;
printf("请输入电话号码:");
scanf("%s",q->numbers);
p->next=q;
q->prev=p;
p=q;
}
else
{
printf("开辟节点空间失败!\n");
break;
}
}
p->next=NULL;
}
void show_list(PLP head)
{
PLP p;
p=head->next;
printf("电话薄信息如下:\n");
printf("姓名%10s电话号码%15s\n","","");
while(p)
{
printf("%-10s%-15s\n",p->name,p->numbers);
p=p->next;
}
}
void insert_list(PLP head)
{
PLP p,q;
p=head;
q=(PLP)malloc(sizeof(PL));
//可以选择插入的位置,暂时未实现
if(q)//默认插入到表头
{
printf("请输入要插入的电话信息:");
printf("请输入用户名:");
scanf("%s",q->name);
printf("请输入电话号码:");
scanf("%s",q->numbers);
q->next=p->next;
p->next->prev=q;
p->next=q;
q->prev=p;
}
else
{
printf("开辟节点空间失败!\n");
}
}
void delete_list(PLP head)
{
char cons[12];
int i=1,j=0;
PLP p,q;
p=head->next;
printf("请输入要删除的用户名或者电话号码:");
scanf("%s",cons);
while(cons[j] != '\0')
j++;
while(p)
{
if(j < 10)
{
if(strcmp(p->name,cons) == 0)
{
q=p;
p->prev->next=p->next;
if(p->next)
p->next->prev=p->prev;
free(q);
i--;
break;//可能会有重名的。暂时不管。
}
}
else
{
if(strcmp(p->numbers,cons) == 0)
{
q=p;
p->prev->next=p->next;
if(p->next)
p->next->prev=p->prev;
free(q);
i--;
break;//电话相重的一般不存在,但有可能是用户大意输入错误而导致。
}
}
p=p->next;
}
if(i)
printf("没有找到此用户信息!\n");
}
PLP sort_list(PLP head)
{
char max[10];//这里以名字进行排序,以电话号码进行排序可能没有多大意义
PLP p,q,mp,h,tmp;
q=h=(PLP)malloc(sizeof(PL));//开辟新表头
q->prev=h->prev=NULL;
p=head->next;
while(p)
{
strcpy(max,p->name);//设置最小元素,放在这里是为了防止p为零时,p->date不存在,而出错。
mp=p;//初始mp
while(p)
{
if(strcmp(max,p->name) > 0)//寻找最小元素,并保存其节点
{
strcpy(max,p->name);
mp=p;
}
p=p->next;
}
mp->prev->next=mp->next;//将mp从旧链接中断开
if(mp->next)//mp->next可能为空
mp->next->prev=mp->prev;
q->next=mp;//插入到新的双向链表
mp->prev=q;
q=mp;
p=head->next;//设置新初始,开始下一次循环
}
q->next=NULL;
return h;
}
void find_list(PLP head)
{
char cons[12];
int i=1,j=0;
PLP p;
p=head->next;
printf("请输入要查找的用户名或者电话号码:");
scanf("%s",cons);
while(cons[j] != '\0')
j++;
while(p)
{
if(j < 10)
{
if(strcmp(p->name,cons) == 0)
{
i--;
break;//可能会有重名的。暂时不管。
}
}
else
{
if(strcmp(p->numbers,cons) == 0)
{
i--;
break;//电话相重的一般不存在,但有可能是用户大意输入错误而导致。
}
}
p=p->next;
}
if(i)
printf("没有找到此用户信息!\n");
else//目前不支持重名查找
{
printf("姓名%10s电话号码%15s\n","","");
printf("%-10s%-15s\n",p->name,p->numbers);
}
}
void write_list(PLP head)
{
char filename[20];
FILE *fp;
PLP p;
p=head->next;
printf("请输入所用的文件名:");
scanf("%s",filename);
if((fp=fopen(filename,"w")) == NULL)
{
printf("无法打开此文件!\n");
exit(0);
}
//可以把信息个数写入文件,这里没有实现。
while(p)
{
fputs(p->name,fp);
fputs("!",fp);
fputs(p->numbers,fp);
fputs("!",fp);
p=p->next;
}
fclose(fp);
printf("写入成功!\n");
}
void read_file(PLP head)
{
char filename[20],name[10],numbers[12],c;
int i=0,j=0;
FILE *fp;
PLP p;
p=head->next;
while(p)//统计信息个数。若信息个数已经写入文件,可以从文件读取信息个数。
{
i++;
p=p->next;
}
printf("请输入要打开的文件名:");
scanf("%s",filename);
if((fp=fopen(filename,"r")) == NULL)
{
printf("无法打开此文件!\n");
exit(0);
}
printf("姓名%10s电话号码%15s\n","","");
while(i)
{
j=0;
while(j<10)
{
if((c=fgetc(fp)) != '!')
name[j]=c;
else
{
name[j]='\0';
break;
}
j++;
}
j=0;
while(j<12)
{
if((c=fgetc(fp)) != '!')
numbers[j]=c;
else
{
numbers[j]='\0';
break;
}
j++;
}
printf("%-10s%-15s\n",name,numbers);
i--;
}
fclose(fp);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
///////以下操作数据库
////////////////////////////////////////////////////////////////////////////////////////////////////////
void createtable(PLP head)
{
char str[100];
PLP p;
MYSQL *conn;
MYSQL_RES *res;
MYSQL_ROW row;
p=head->next;
char *server="localhost";
char *user="root";
char *password="qwert321";
char *database="B";
conn=mysql_init(NULL);
//连接数据库
if(!mysql_real_connect(conn,server,user,password,database,0,NULL,0))
{
fprintf(stderr,"%sn",mysql_error(conn));
exit(1);
}
//发送查询
//创建表
if(mysql_query(conn,"create table if not exists phonelistx(name varchar(10),numbers varchar(12))"))//不存在就创建,否则就打开
{
fprintf(stderr,"%sn",mysql_error(conn));
exit(1);
}
while(p)//循环插入
{
sprintf(str,"insert into phonelistx values(\"%s\",\"%s\")",p->name,p->numbers);//注意有引号
if(mysql_query(conn,str))
{
fprintf(stderr,"%sn",mysql_error(conn));
exit(1);
}
p=p->next;
}
//输出全部信息
if(mysql_query(conn,"select * from phonelistx"))
{
fprintf(stderr,"%sn",mysql_error(conn));
exit(1);
}
res=mysql_use_result(conn);
while((row=mysql_fetch_row(res)) != NULL)//每次取一行
printf("%-10s%-15s\n",row[0],row[1]);//取一行的两个参数
mysql_free_result(res);
mysql_close(conn);
printf("本次操作结束!\n");
}
void inserttable()
{
char str[100],name[10],numbers[12];
MYSQL *conn;
MYSQL_RES *res;
MYSQL_ROW row;
char *server="localhost";
char *user="root";
char *password="qwert321";
char *database="A";
conn=mysql_init(NULL);
//连接数据库
if(!mysql_real_connect(conn,server,user,password,database,0,NULL,0))
{
fprintf(stderr,"%sn",mysql_error(conn));
exit(1);
}
printf("请输入要插入的用户名:");
scanf("%s",name);
printf("请输入要插入的电话号码:");
scanf("%s",numbers);
//发送查询
sprintf(str,"insert into phonelistx values(\"%s\",\"%s\")",name,numbers);//注意有引号
if(mysql_query(conn,str))
{
fprintf(stderr,"%sn",mysql_error(conn));
exit(1);
}
//输出全部信息
if(mysql_query(conn,"select * from phonelistx"))
{
fprintf(stderr,"%sn",mysql_error(conn));
exit(1);
}
res=mysql_use_result(conn);
while((row=mysql_fetch_row(res)) != NULL)//每次取一行
printf("%-10s%-15s\n",row[0],row[1]);//取一行的两个参数
mysql_free_result(res);
mysql_close(conn);
printf("本次操作结束!\n");
}
void deletetable()
{
int j=0;
char str[100],cons[12];
MYSQL *conn;
MYSQL_RES *res;
MYSQL_ROW row;
char *server="localhost";
char *user="root";
char *password="qwert321";
char *database="A";
conn=mysql_init(NULL);
//连接数据库
if(!mysql_real_connect(conn,server,user,password,database,0,NULL,0))
{
fprintf(stderr,"%sn",mysql_error(conn));
exit(1);
}
printf("请输入要删除的用户名或者电话号码:");
scanf("%s",cons);
while(cons[j] != '\0')
j++;
if(j < 10)//按用户名删除
{//发送查询
sprintf(str,"delete from phonelistx where name=\"%s\"",cons);//注意有引号
if(mysql_query(conn,str))
{
fprintf(stderr,"%sn",mysql_error(conn));
exit(1);
}
}
else//按电话号码删除
{
sprintf(str,"delete from phonelistx where numbers=\"%s\"",cons);//注意有引号
if(mysql_query(conn,str))
{
fprintf(stderr,"%sn",mysql_error(conn));
exit(1);
}
}
//输出全部信息
if(mysql_query(conn,"select * from phonelistx"))
{
fprintf(stderr,"%sn",mysql_error(conn));
exit(1);
}
res=mysql_use_result(conn);
while((row=mysql_fetch_row(res)) != NULL)//每次取一行
printf("%-10s%-15s\n",row[0],row[1]);//取一行的两个参数
mysql_free_result(res);
mysql_close(conn);
printf("本次操作结束!\n");
}
void showtable()
{
MYSQL *conn;
MYSQL_RES *res;
MYSQL_ROW row;
char *server="localhost";
char *user="root";
char *password="qwert321";
char *database="A";
conn=mysql_init(NULL);
//连接数据库
if(!mysql_real_connect(conn,server,user,password,database,0,NULL,0))
{
fprintf(stderr,"%sn",mysql_error(conn));
exit(1);
}
//输出全部信息
if(mysql_query(conn,"select * from phonelistx"))
{
fprintf(stderr,"%sn",mysql_error(conn));
exit(1);
}
res=mysql_use_result(conn);
while((row=mysql_fetch_row(res)) != NULL)//每次取一行
printf("%-10s%-15s\n",row[0],row[1]);//取一行的两个参数
mysql_free_result(res);
mysql_close(conn);
printf("本次操作结束!\n");
}
void sorttable()
{
char str[100];
MYSQL *conn;
MYSQL_RES *res;
MYSQL_ROW row;
char *server="localhost";
char *user="root";
char *password="qwert321";
char *database="A";
conn=mysql_init(NULL);
//连接数据库
if(!mysql_real_connect(conn,server,user,password,database,0,NULL,0))
{
fprintf(stderr,"%sn",mysql_error(conn));
exit(1);
}
//发送查询
sprintf(str,"select * from phonelistx order by name desc");//注意有引号
if(mysql_query(conn,str))
{
fprintf(stderr,"%sn",mysql_error(conn));
exit(1);
}
res=mysql_use_result(conn);
while((row=mysql_fetch_row(res)) != NULL)//每次取一行
printf("%-10s%-15s\n",row[0],row[1]);//取一行的两个参数
mysql_free_result(res);
mysql_close(conn);
printf("本次操作结束!\n");
}
void findtable()
{
int j=0;
char str[100],cons[12];
MYSQL *conn;
MYSQL_RES *res;
MYSQL_ROW row;
char *server="localhost";
char *user="root";
char *password="qwert321";
char *database="A";
conn=mysql_init(NULL);
//连接数据库
if(!mysql_real_connect(conn,server,user,password,database,0,NULL,0))
{
fprintf(stderr,"%sn",mysql_error(conn));
exit(1);
}
printf("请输入要查找的用户名或者电话号码:");
scanf("%s",cons);
while(cons[j] != '\0')
j++;
if(j < 10)//按用户名查找
{//发送查询
sprintf(str,"select * from phonelistx where name=\"%s\"",cons);//注意有引号
if(mysql_query(conn,str))
{
fprintf(stderr,"%sn",mysql_error(conn));
exit(1);
}
}
else//按电话号码查找
{
sprintf(str,"select * from phonelistx where numbers=\"%s\"",cons);//注意有引号
if(mysql_query(conn,str))
{
fprintf(stderr,"%sn",mysql_error(conn));
exit(1);
}
}
res=mysql_use_result(conn);
while((row=mysql_fetch_row(res)) != NULL)//每次取一行
printf("%-10s%-15s\n",row[0],row[1]);//取一行的两个参数
mysql_free_result(res);
mysql_close(conn);
printf("本次操作结束!\n");
}
void main()
{
int i=0;
PLP head;
head=(PLP)malloc(sizeof(PL));
head->next=head->prev=NULL;
create_list(head);//刚开始要先建立链表,把链表数据写到mysql中,如果mysql中已经有表存在,则可以不用这个函数调用。
//show_list(head);
/*insert_list(head);
show_list(head);
delete_list(head);
show_list(head);
//排序,按姓名或者电话号码
head=sort_list(head);
show_list(head);*/
/*while(1)
{
printf("1.创建电话薄\n2.插入用户信息\n3.删除用户信息\n4.查找用户信息\n5.按姓名排序\n6.显示用户信息\n7.写入文件\n8.打开文件并显示信息\n请输入选项(输入-1退出程序):");
scanf("%d",&i);
if(i == -1)
break;
switch(i)
{
case 1:create_list(head);break;
case 2:insert_list(head);break;
case 3:delete_list(head);break;
case 4:find_list(head);break;
case 5:head=sort_list(head);break;
case 6:show_list(head);break;
case 7:write_list(head);break;
case 8:read_file(head);break;//可以读入并建立链表,这里直接显示出文件内容了。
default:printf("输入有误,请重新输入!\n\n");break;
}
if(i>=1 && i<=8)
printf("执行完毕!\n\n");
}*/
/*showtable();
createtable(head);
inserttable();
//deletetable();
sorttable();*/
while(1)
{
printf("1.创建电话薄\n2.插入用户信息\n3.删除用户信息\n4.查找用户信息\n5.按姓名排序\n6.显示用户信息\n7.退出程序\n请输入选项:");
scanf("%d",&i);
switch(i)
{
case 1:createtable(head);break;
case 2:inserttable();break;
case 3:deletetable();break;
case 4:findtable();break;
case 5:sorttable();break;
case 6:showtable();break;
case 7:exit(0);
default :printf("输入有误,请重新输入!\n\n");break;
}
printf("\n\n");
}
}