将链表所写通讯录保存到数据库中

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sqlite3.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>


struct person				//定义结构体,存储联系人信息
{
    char name[20];
    char tel[12];
    char addr[50];
    struct person *next;
};
struct people
{
	char name[20];
    char tel[12];
    char addr[50];
};

typedef struct person Person;
typedef struct person * Link;
typedef struct people People;
typedef struct people * PLink;

void release(Link* head)					//清空通讯录(释放头结点以外的所有结点)
{
	Link p;
	while((*head)->next != NULL)
	{
		p = (*head)->next;
		(*head)->next = p->next;
		free(p);
	}
}

int create_node(Link * newnode)				//创立结点
{
	int count = 0;
	do										//为避免空间申请失败,进行10次申请,成功即返回
	{
		*newnode = (Link)malloc(sizeof(Person));
		count++;
		if(count == 10)
		{
			return 0;
		}
	}while(!*newnode);
	return -1;	
}
void  createlink(Link * head)				//创建带表头结点的链表
{
	if(!create_node(head))
	{
		release(head);
		printf("创建失败!");
		exit(-1);
	}
	(*head)->next = NULL;
}

void add(Link head, Link newnode)			//添加联系人
{
	if(!create_node(&newnode))
	{
		free(newnode);
		printf("add failed space not enough!\n");
		exit(-1);
	}
	else
	{
		Link p = head->next;
		newnode->next = head->next;
		head->next = newnode;

		//添加联系人信息
		printf("enter name:");			
		scanf("%s",newnode->name);
		printf("enter tel:");
		scanf("%s",newnode->tel);
		printf("enter addr:");
		scanf("%s",newnode->addr);
		
		while(p != NULL)
		{
			if(strcmp(newnode->name,p->name) == 0)
			{
				printf("联系人已存在\n");
				head->next = newnode->next;
				free(newnode);
				return;
			}
			p = p->next;
		}
		
		while(strlen(newnode->tel) != 11)
		{
			printf("please enter 11 telphone number again!\n");			//11位联系电话
			scanf("%s",newnode->tel);
		}
		newnode->tel[11] = '\0';
	}
}

void delete(Link head)			//删除联系人
{
	char name[20];
	gets(name);

	Link p, q;
	p = head->next;
	q = head;
	
	while(p != NULL)
	{
		if(strcmp(p->name,name) == 0 )
		{
			q->next = p->next;
			free(p);
			return;
		}
		q = p;
		p = p->next;
	}
	if(p == NULL)
	{
		printf("no such person!\n");
		return;
	}
	
}

void find(Link head)			//查找联系人
{
	char name[20];
	gets(name);
	Link p;
	p = head->next;

	while(p != NULL)
	{
		if(strcmp(p->name,name) == 0)
		{
			printf("%s %s %s\n",p->name, p->tel, p->addr);
			return;
		}
		p = p->next;
	}
	if(p == NULL)
	{
		printf("no such person!\n");
	}
}

void modify(Link head)			//修改联系人
{
	char name[20];
	gets(name);
	Link p;
	p = head->next;
	while(p != NULL)
	{
		if(strcmp(p->name,name) == 0)
		{
			printf("请重新输入相关信息:");
			scanf("%s %s %s",p->name,p->tel,p->addr);
			getchar();
			return;
		}
		p = p->next;
	}
	if(p = NULL)
	{
		printf("no such person!\n");
	}
	
}

int length(Link head)		//计算联系人个数
{
	int count = 0;
	Link p;
	p = head->next;
	while(p != NULL)
	{
		count++;
		p = p->next;
	}
	return count;
}

void sort(Link head)		//根据姓名大小,用冒泡法排序
{
	Link p,q;
	int len = length(head);
	int i, j;
	char tname[20];
	char ttel[12];
	char taddr[50];
	for(i = len - 2; i >= 0; i--)
	{
		p = head->next;
		q = p->next;
		
		for(j = 0; j <= i; j++)
		{
			if(strcmp(p->name,q->name) > 0)
			{
				strcpy(tname,p->name);
				strcpy(ttel,p->tel);
				strcpy(taddr,p->addr);
				
				strcpy(p->name,q->name);
				strcpy(p->tel,q->tel);
				strcpy(p->addr,q->addr);
				
				strcpy(q->name,tname);
				strcpy(q->tel,ttel);
				strcpy(q->addr,taddr);
			}
			p = p->next;
			q = q->next;
		}
	}
}

void display(Link head)					//显示排序后的所有联系人信息
{
	sort(head);
	Link p;
	p = head->next;
	if(p == NULL)
	{
		printf("no anyone!\n");
	}
	else
	{
		while(p != NULL)
		{
			printf("%s %s %s\n",p->name, p->tel, p->addr);
			p = p->next;
		}
	}
}

void menu()				//功能菜单
{
	printf("\n");
	printf("***** Welcome To Used My Addressbook *****\n");
    printf("***** 1.添加联系人 *****\n");
	printf("***** 2.删除联系人 *****\n");
	printf("***** 3.查找联系人 *****\n");
	printf("***** 4.修改联系人 *****\n");
	printf("***** 5.显示所有联系人 *****\n");
	printf("***** 6.删除所有联系人 *****\n");
	printf("***** 7.退出通讯录 *****\n");
	printf("***** 键入相应值选择对应功能 *****\n");
	printf("***** Welcome To Used My Addressbook *****\n");
	printf("\n");
}

void function(char ch[], Link head, Link newnode)		//各选项对应的功能调用
{
	if(strcmp(ch,"1") == 0)
	{
		printf("enter name tel addr:\n");
		add(head,newnode);
	}
	else if(strcmp(ch,"2") == 0 )
	{
		printf("please enter the name of you need to delete:");
		delete(head);		
	}
	else if(strcmp(ch,"3") == 0)
	{
		printf("please enter the name of you need to find:");
		find(head);
	}
	else if(strcmp(ch,"4") == 0)
	{
		printf("please enter the name of you need to modify:");
		modify(head);
	}
	else if(strcmp(ch,"5") == 0)
	{
		display(head);
	}
	else if(strcmp(ch,"6") == 0)
	{
		release(&head);
	}	
}

void db_to_link(Link head)
{
	Link tmp,p;
	int nrow,ncolumn;
	char **azresult;
	char *sql,*a[1000];
	char *errmsg;
	int ret;
	int i,j;
	sqlite3 *db;

	ret=sqlite3_open("addressbook.db",&db);
	if(ret != SQLITE_OK)
	{
	printf("open error");
	exit(1);
	}

	sql="create table if not exists human(name text primary key,tel text, addr text);";
	ret=sqlite3_exec(db,sql,NULL,NULL,&errmsg);
	if(ret != SQLITE_OK)
	printf("creat error");
	
	sql = "select * from human;";
	ret = sqlite3_get_table(db,sql,&azresult,&nrow,&ncolumn,&errmsg);
	if(ret != SQLITE_OK)
	{
	printf("get table error:%s",errmsg);
	}
	
	if(!create_node(&tmp))
	{
		free(tmp);
		printf("create node failed\n");
		exit(-1);
	}

	for(i=1;i<=nrow;i++)
	{
		strcpy(tmp->name,azresult[i * ncolumn]);
		strcpy(tmp->tel,azresult[i * ncolumn+1]);
		strcpy(tmp->addr,azresult[i * ncolumn+2]);
		tmp->next = head->next;
		head->next = tmp;
	
		if(!create_node(&tmp))
		{
			free(tmp);
			printf("create node failed\n");
			exit(-1);
		}
			
	}
	sqlite3_free_table(azresult);

}

void link_to_db(Link head)
{
	sqlite3 *db;
	char *sql;
	char sql1[100];
	char *errmsg;
	char *name;
	char *tel;
	char *addr;
	int ret; 

	Link p;
	p=head->next; 

	ret=sqlite3_open("addressbook.db",&db);
	if(ret != SQLITE_OK)
	{
	printf("open error");
	exit(1);
	}

	sql="create table if not exists human(name text primary key,tel text, addr text);";
	ret=sqlite3_exec(db,sql,NULL,NULL,&errmsg);
	if(ret != SQLITE_OK)
	printf("creat error");

	sql="delete from human;";
	ret=sqlite3_exec(db,sql,NULL,NULL,&errmsg);
	if(ret != SQLITE_OK)
	printf("delete error\n");
	while( p != NULL)
	{
		sprintf(sql1,"insert into human values('%s','%s','%s');",p->name,p->tel,p->addr);
		ret=sqlite3_exec(db,sql1,NULL,NULL,&errmsg);
		if(ret != SQLITE_OK)
		{
		printf("insert  error");
		exit(1);
		}
		p=p->next;
	}

	sqlite3_close(db);

}

int main()
{
	char ch[2] ;
	Link head = NULL;
	Link newnode = NULL;
	
	createlink(&head);

	db_to_link(head);

	while(1)
	{
    	menu();
		scanf("%s",ch);
		getchar();
		ch[1] = '\0';
		
		function(ch, head, newnode);
		
		if(strcmp(ch,"7") == 0)
		{	
			link_to_db(head);
			release(&head);
			exit(0);
		} 
		if(strcmp(ch,"1") < 0 || strcmp(ch,"7") > 0) 
		{
			printf("输入值非法,请重新输入\n");
		}

	}

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值