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

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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值