红联Linux门户
Linux帮助

Linux下C语言双向链表电话薄,能读写文件,连接mysql

发布时间:2015-09-21 10:43:18来源:linux网站作者:飘雪的冬夜

应付老师部置的作业而写的,水平有限,写的不好。

#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"); 

}