#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;
}
将链表所写通讯录保存到数据库中
最新推荐文章于 2023-03-29 22:27:35 发布